1

我正在尝试为我的用户制作登录详细信息。

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

IPAddress, LoginTime, LogOutTime, LoginPlace

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

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

我正在考虑Session_End在文件中的事件中添加代码以Global.asax进行跟踪。但是我怎么能跟踪会话呢?

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

任何建议,将不胜感激。

提前致谢。

4

3 回答 3

0

通过将某种辅助方法放入任何称为 UpdateLastVisited 的控制器/操作中?

UpdateLastVisited 看起来像。

            UpdateLastVisited(this.User)
                {  
                       "UPDATE [dbo].[User] set LastVisited = @date WHERE Id = @userId";
                        AddParameters etc..
                 }
于 2013-04-13T08:26:30.907 回答
0

在保存用户的 IPAddress 时,您应该记住以下几点:

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

话虽如此,当浏览器关闭而不注销时,您会遇到实际的注销用户问题:

  1. 编写一个基于 HTTP 的 Web 服务,它是您的 Web 应用程序的一部分。公开一个网络方法说“注销”并在 Window.Close() javascript 事件上使用 AJAX 调用此方法。
  2. 如果您不想继续使用 WebService,您可以在 Window.close() 上的 javascript 中调用您的注销网页。
  3. 即使您使用上述两种方法之一,请记住在服务器端代码中设置会话超时。我希望这有帮助。
于 2013-04-13T08:42:32.190 回答
0

但是我怎么能跟踪会话呢?

ASP.NETSession明确定义为附加到特定用户的对象:

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

于 2013-04-13T10:22:16.733 回答