3

我编写了一个网站,准备了一个登录机制(通过文本框,而不是登录工具),用户想要注销,他们点击注销按钮。但是,我的问题是,如果用户不单击注销按钮或关闭网页或切换另一个页面,我该如何理解这种情况?
根据我的机制,当用户注销时,在数据库中进行一些插入和删除操作。
我也想通过关闭页面来做到这一点,切换另一个。
谢谢。

4

6 回答 6

14

听起来您在注销时正在执行数据库操作,当人们只是在不单击注销按钮的情况下导航离开时,代码不会触发。

在您的 global.asax 中,查看 session_end。也许你可以把你的操作放在那里。

protected void Session_End(Object sender, EventArgs e) 
{ 
    // Your code goes here. Since your logout code probably relied on the user being
    // logged in, you might end up checking Request.IsAuthenticated here. Why? Because
    // this event fires any time a session ends -- even if the user is not logged in! 
}

请注意,如果您使用它,它实际上会在 IIS 会话结束时触发,而不是在浏览器关闭时触发。默认情况下,会话在 20 分钟不活动后超时。

一旦你实现了这个,你可以让你的注销页面调用 Session.Abandon,这将触发 Session_End。这对我来说似乎很干净。

这是一个 MSDN 链接,其中包含有关会话事件的更多详细信息:http: //msdn.microsoft.com/en-us/library/ms178583.aspx

于 2010-05-17T21:37:35.397 回答
1

如前所述,会话结束可能是您最好的选择,但如果您偏执,您可以在您的页面上放置一些 javascript/AJAX,每 X 秒 ping 您的服务器,基本上说“我还在这里”。然后,如果他们离开,而不是等待整个 20 分钟左右的会话结束,您可以在 X 秒内知道他们已经离开,因为他们不再 ping。

于 2010-05-17T21:42:16.480 回答
1

如果您的会话超时为 20 分钟,您只会在 20 分钟后检测到会话已结束 = 用户已离开您的页面。您可以像 Brian 描述的那样在 global.asax session_end 中检测会话结束。

如果您想更早检测到有人离开您的页面 - 比如一分钟后,您可以将会话超时减少到 1 分钟。

那么问题是,如果用户没有在您的页面上执行任何操作 - 没有回发到服务器 - 尽管他仍在查看您的页面,但他的会话将超时。

为了解决这个问题,您可以使用保持活动机制。只要用户查看您的页面,您的页面就会在后台定期调用服务器。这可以通过 AJAX Javascript 或隐藏 iFrame 等其他机制来完成。

参见例如:ASP.NET AJAX 和保持会话活动 - 标准方法是什么?

于 2010-05-17T21:47:36.670 回答
0

我不完全确定,但我认为实现这一点的一种方法是不对 cookie 设置过期时间,这将导致它成为一个会话 cookie,在浏览器关闭时会丢失。由于您的会话 cookie 通常包含会话密钥,因此当他们再次打开浏览器时,他们基本上将开始一个新会话。

于 2010-05-17T21:39:06.593 回答
0

当我创建用户系统时,我将登录用户(类似于会话)添加到数据库表中,并给他们时间戳。每次刷新站点时,我都会运行查询以删除时间戳超过 30 分钟的用户。这是非常简单的解决方案,也许有更好的方法。

于 2010-05-17T21:41:03.240 回答
0

可能想查看global.asax中的事件。您可以使用 session_end 事件更新数据库。您还可以使用在每个页面和控件上触发的 beginrequest 事件(如果您有多个控件,您将在每个页面上获得多个点击)。您还可以在 page_load 事件中添加一些内容。

于 2010-05-17T21:43:33.263 回答