如何在浏览器显式关闭而不使用ASP.Net注销时跟踪注销详细信息

本文关键字:注销 ASP Net 跟踪 详细信息 浏览器 | 更新日期: 2023-09-27 18:08:53

我想让我的用户登录的详细信息。

我在数据库表中存储以下列:

IPAddress, LoginTime, LogOutTime, LoginPlace

我可以在用户手动登录和注销时成功获取详细信息(通过点击Logout按钮)

我的问题是当用户不单击Logout或会话过期或直接关闭浏览器时,我无法跟踪记录。

我想在Global.asax文件的Session_End事件中添加代码来跟踪。但是我怎样才能跟踪会话呢?

这是一个好的解决方案吗?

如有任何建议,不胜感激。

如何在浏览器显式关闭而不使用ASP.Net注销时跟踪注销详细信息

通过在任何控制器/操作中调用某种辅助方法,例如UpdateLastVisited?

UpdateLastVisited看起来像。

            UpdateLastVisited(this.User)
                {  
                       "UPDATE [dbo].[User] set LastVisited = @date WHERE Id = @userId";
                        AddParameters etc..
                 }

在保存用户的IPAddress时,有几件事你应该记住:

  1. 如果你正在开发这个内部网站点,而用户的机器有动态分配的IP地址,你的逻辑必然会出错。
  2. 如果您正在为Internet开发站点,则您获得的IP地址是ISP的IP地址。要解决这个问题,你必须使用某种ActiveX(不建议)。
  3. 如果您仍然决定继续使用2,请记住您将退回到1,因此4是更好的选择。
  4. 要么不编写依赖于IP地址的web应用程序,要么确保为Intranet编写此应用程序,并为机器分配静态IP地址。

说了这么多,来看看你的实际问题,即在浏览器关闭时注销用户而不注销:

    写一个基于HTTP的web服务,它是你的web应用程序的一部分。在javascript的windows . close()事件上使用AJAX调用这个方法。
  1. 如果你不想继续使用WebService,你可以用javascript在windows .close()中调用你的注销网页。
  2. 即使您使用上述两种方法之一,也要记住在服务器端代码中设置会话超时。我希望这有帮助。

但是我如何跟踪会话呢?

一个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引发,这将使您的代码具有一定的一致性。此外,它会立即清理服务器上的会话。看,当用户"注销"时,除非你真的终止了他们的会话,否则它仍然在服务器上存活,直到超时。