我正在尝试制作用户的登录详细信息。
我将以下列存储在数据库表中:
IPAddress, LoginTime, LogOutTime, LoginPlace
我可以在用户登录并手动注销(通过点击Logout
按钮)时成功获取详细信息
我的问题是当用户未点击Logout
或会话已过期或直接关闭浏览器时,我无法跟踪记录。
我正在考虑在Session_End
文件中的Global.asax
事件中添加代码以进行跟踪。但我怎么能跟踪会话?
这是一个很好的解决方案吗?
任何建议将不胜感激。
提前致谢。
答案 0 :(得分:0)
通过在任何名为UpdateLastVisited的控制器/动作中放置某种辅助方法?
UpdateLastVisited看起来像。
UpdateLastVisited(this.User)
{
"UPDATE [dbo].[User] set LastVisited = @date WHERE Id = @userId";
AddParameters etc..
}
答案 1 :(得分:0)
在保存用户的IPAddress时,您应该记住以下几点:
话虽如此,在浏览器关闭时注明用户的实际问题而不注销:
答案 2 :(得分:0)
但我该如何跟踪会话?
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
加注,这将为您的代码提供一致性。此外,它立即清理服务器上的会话。请注意,当用户退出"时,除非您实际上已经杀死他们的会话,否则它在服务器上仍然有效,直到超时为止。