【发布时间】:2018-08-16 11:57:37
【问题描述】:
我希望记录用户的登录和注销时间戳。
我了解,一旦用户点击登录页面,就会创建一个新的浏览器特定会话并执行 sessionCreated(HttpSessionEvent se)。当会话无效时,会话被破坏并执行sessionDestroyed(HttpSessionEvent se)。在这种情况下,记录登录和注销时间戳将完美运行。
但是,例如,用户已登录但关闭了浏览器窗口。 下次打开浏览器时,将生成一个新的会话 ID,并且用户需要重新登录。因此,该用户的先前登录-注销记录将不完整,并且将在数据库中插入具有当前会话 ID 的新记录。
如何解决这个设计问题?我阅读了一些讨论 AJAX 轮询和 JS onunload 的答案,但这些似乎不是一个可靠的解决方案。
另一方面,有没有办法让会话在浏览器关闭时保持活动状态?
提前致谢。
【问题讨论】:
-
除了超时没有可靠的方法:在 X 小时后清理会话。
-
关于即使在浏览器关闭时也能保持会话活动:您可以将会话令牌存储在持久性 cookie 中(浏览器在关闭时不会丢弃)。
-
这就是我所做的。我在
sessionCreated(HttpSessionEvent se)中创建了 2 个属性“注销代码”和“登录”。分别将它们设置为 0 和 FALSE。身份验证成功后,我将“logged-in”的值设置为 TRUE,对于正常注销,我将“logout-code”的值设置为 1。 -
在
sessionDestroyed(HttpSessionEvent se)里面我检查了logged-in和logout-code的值。如果 logged-in 为 TRUE 且 logout-code 为 1,则正常终止会话。如果 logged-in 为 TRUE,logout-code 为 0,则为异常。你能指出任何缺陷吗?
标签: session authentication servlets jakarta-ee