如何在浏览器显式关闭而不使用ASP.Net注销时跟踪注销详细信息
本文关键字:注销 ASP Net 跟踪 详细信息 浏览器 | 更新日期: 2023-09-27 18:08:53
我想让我的用户登录的详细信息。
我在数据库表中存储以下列:
IPAddress, LoginTime, LogOutTime, LoginPlace
我可以在用户手动登录和注销时成功获取详细信息(通过点击Logout
按钮)
我的问题是当用户不单击Logout
或会话过期或直接关闭浏览器时,我无法跟踪记录。
我想在Global.asax
文件的Session_End
事件中添加代码来跟踪。但是我怎样才能跟踪会话呢?
这是一个好的解决方案吗?
如有任何建议,不胜感激。
通过在任何控制器/操作中调用某种辅助方法,例如UpdateLastVisited?
UpdateLastVisited看起来像。
UpdateLastVisited(this.User)
{
"UPDATE [dbo].[User] set LastVisited = @date WHERE Id = @userId";
AddParameters etc..
}
在保存用户的IPAddress时,有几件事你应该记住:
- 如果你正在开发这个内部网站点,而用户的机器有动态分配的IP地址,你的逻辑必然会出错。
- 如果您正在为Internet开发站点,则您获得的IP地址是ISP的IP地址。要解决这个问题,你必须使用某种ActiveX(不建议)。
- 如果您仍然决定继续使用2,请记住您将退回到1,因此4是更好的选择。
- 要么不编写依赖于IP地址的web应用程序,要么确保为Intranet编写此应用程序,并为机器分配静态IP地址。
说了这么多,来看看你的实际问题,即在浏览器关闭时注销用户而不注销:
- 写一个基于HTTP的web服务,它是你的web应用程序的一部分。在javascript的windows . close()事件上使用AJAX调用这个方法。
- 如果你不想继续使用WebService,你可以用javascript在windows .close()中调用你的注销网页。
- 即使您使用上述两种方法之一,也要记住在服务器端代码中设置会话超时。我希望这有帮助。
但是我如何跟踪会话呢?
一个ASP。NET Session
被明确定义为附加到特定用户的对象:
ASP。. NET会话状态在有限的时间窗口中将来自同一浏览器的请求标识为会话,并提供在该会话期间持久保存变量值的方法。
因此,根据定义,当您访问Session
时,它将附加到用户和ASP。NET会为你保持同步。现在,利用这些信息,我建议您在Session_Start
:
protected void Session_Start(Object sender, EventArgs e)
{
var session = HttpContext.Current.Session;
session["IPAddress"] = Request.UserHostAddress;
session["LoginTime"] = DateTime.Now;
// you'll need to plug in here how you're going to determine this
session["LoginPlace"] = "something";
}
,然后在Session_End
中你可以这样做:
protected void Session_Start(Object sender, EventArgs e)
{
HttpContext.Current.Session["LogOutTime"] = DateTime.Now;
// and now here you can persist those values to the database because
// the session has ended
}
,然后我将建议您在注销时做一些不同的事情。与其像您现在所说的那样设置这些值并将它们持久化到数据库,不如这样做:
HttpContext.Current.Session.Abandon();
将强制Session_End
引发,这将使您的代码具有一定的一致性。此外,它会立即清理服务器上的会话。看,当用户"注销"时,除非你真的终止了他们的会话,否则它仍然在服务器上存活,直到超时。