用户关闭浏览器时的“注销”事件

时间:2017-02-02 12:32:08

标签: c# asp.net asp.net-mvc

我有一个名为Eventlog的表,此表包含有关用户连接的数据:例如,当用户调用此操作时:

public ActionResult Login(string username, string password)
{

}
  • 我测试用户是否已经存在于数据库中

  • 如果是,我使用Session["user"] = usernameFormsAuthentication.SetAuthCookie(username, true);设置用户 会话

  • 然后我在Eventlog表上记录了一条记录:用户X在Y.c时连接

这很好用,但我也希望有关用户注销的信息。我可以对LogOff Action做类似的事情,我想它也能正常工作,但是大多数人不使用注销按钮,他们只关闭浏览器,如何实现用户注销事件当用户关闭浏览器时出现这种情况:用户X已在Y时断开连接。在这种情况下,Session_End()不能满足需要。

3 个答案:

答案 0 :(得分:10)

您必须接受网络技术的限制。将响应发送给用户代理后,服务器无法知道请求发生了什么。用户可以正常关闭用户代理。 UA可能会崩溃。用户可能会丢失互联网连接。他的电脑会崩溃。所有这些都可以在客户端甚至接收响应之前发生。这是您正在处理的环境。拥抱它而不是战斗它。

如果跟踪注销对您很重要,您可以使用以下几种技术:

  1. 依靠会话超时。如果您选择足够短的超时,则可能足以满足您的安全要求。我认为这是首选方式,因为它很简单并且经过验证。
  2. 使用脚本将心跳从UA发送到服务器。您可以使用" ping"请求,长时间呼叫等。但是,请注意这带来的性能影响,对服务器的请求数量以及实施的复杂性。
  3. 使用SignalR等现有框架建立客户端到服务器的连接,并让客户端签入服务器。这基本上是第二种选择,为您减少了手动工作。
  4. 所有这些都不会让您拦截用户注销或丢失连接,但如果客户端停止响应,您就会知道连接中断(以多种可能的方式之一)。所以你不应该注册这个"用户注销",而是"用户断开"。

答案 1 :(得分:1)

  

如何实现呢?如果SessionId存在,则每1小时检查 @Mehdi

如果您上次使用以下内容执行新操作时发布帖子:

if(Session["UserName"] != null) {
      /*Update the database with the last time that the user has performed a action*/
}

如果每次用户进行新操作时都会执行操作,那么用户最后一次会在服务器上执行了某些操作。然后,在上次用户未注销时,您知道(不完全是指示符)。

答案 2 :(得分:1)

在服务器端无法知道用户何时关闭浏览器。但是,您可以使用JavaScript在window.close上触发并向服务器发送AJAX调用,从而在用户离开时进行记录。然而,这是不可靠的,因为用户可以控制浏览器设置,并且可以禁用JS。这可能是你能做的最好的事情。