我正在开发一个新的 Asp.net MVC 应用程序,对我来说,查看已登录的用户以及他们的注销时间很重要,如果用户单击注销按钮对我来说没问题。但大多数时候,用户通过浏览器导航出网站或只是关闭浏览器。现在有没有办法。我有一个想法,每两分钟运行一次操作以检查用户是否在那里。但这是一个好主意吗?风险是什么。如果是的话,任何人都有一个如何实现的例子!
3 回答
两天前我正在寻找完全相同的东西。我现在的做法如下:
用户登录
- 我在数据库中保存了一些数据,如会话密钥和用户 ID 以识别他。我还节省了登录时间和更新的 DateTime。
- 如果用户已经通过身份验证,我只会保存它。
用户调用操作
- 我为用户执行的每个操作更新数据库中的 DateTime。
用户使用注销按钮
- 我将数据库中的条目从表“session”移动到“sessionHistory”,并将 DateTime 更新为注销时间。
用户关闭浏览器(这是它变得棘手的地方)
我用 jQuery 构建了一小段代码。我每 30 秒调用一次 $.get 并在 MVC 中戳一个“UpdatePing”操作。
“UpdatePing”操作将更新数据库中的会话条目。现在我可以看看他的浏览器是否真的仍然打开。
警告:您将无法确切知道用户何时关闭选项卡/浏览器。您可以尝试使用事件“beforeunload”,但我不会依赖它(浏览器崩溃等)。
删除过期会话
- 我没有完全删除会话数据。我将会话数据复制到“sessionHistory”表中。
您可以使用 JavaScript 函数onbeforeunload
事件。当用户离开页面时调用此函数。
在该函数上,将您的 ajax 请求发送到用户此时卸载页面的服务器并创建您的逻辑。
对于多个选项卡或多个设备,解决方案很简单。每个多个选项卡都将属于同一会话,但即使用户相同,每个新设备也会有一个新会话。为此可以做的是保存每个会话的最新请求,而不管设备如何。即使用户有多个设备,您的日志也会包含用户每个设备上每个会话的登录时间。
希望这可以帮助
感谢大家的回答,但是当项目变得更大时,两个答案可能会变得复杂。例如,我将通过移动应用程序支持该应用程序。我发现最好的解决方案是使用 SignalR 将单曲从客户端发送到服务器,当这些单曲停止一段时间后,我会自动注销用户。