我有一个名为Eventlog的表,此表包含有关用户连接的数据:例如,当用户调用此操作时:
public ActionResult Login(string username, string password)
{
}
我测试用户是否已经存在于数据库中
如果是,我使用Session["user"] = username
或
FormsAuthentication.SetAuthCookie(username, true);
设置用户
会话
然后我在Eventlog表上记录了一条记录:用户X在Y.c时连接
这很好用,但我也希望有关用户注销的信息。我可以对LogOff Action做类似的事情,我想它也能正常工作,但是大多数人不使用注销按钮,他们只关闭浏览器,如何实现用户注销事件当用户关闭浏览器时出现这种情况:用户X已在Y时断开连接。在这种情况下,Session_End()不能满足需要。
答案 0 :(得分:10)
您必须接受网络技术的限制。将响应发送给用户代理后,服务器无法知道请求发生了什么。用户可以正常关闭用户代理。 UA可能会崩溃。用户可能会丢失互联网连接。他的电脑会崩溃。所有这些都可以在客户端甚至接收响应之前发生。这是您正在处理的环境。拥抱它而不是战斗它。
如果跟踪注销对您很重要,您可以使用以下几种技术:
所有这些都不会让您拦截用户注销或丢失连接,但如果客户端停止响应,您就会知道连接中断(以多种可能的方式之一)。所以你不应该注册这个"用户注销",而是"用户断开"。
答案 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。这可能是你能做的最好的事情。