Session 如何设计Java Web应用程序,使会话在浏览器关闭时终止?

Session 如何设计Java Web应用程序,使会话在浏览器关闭时终止?,session,authentication,servlets,jakarta-ee,Session,Authentication,Servlets,Jakarta Ee,我希望为用户记录登录和注销时间戳 我知道,一旦用户点击登录页面,就会创建一个新的浏览器特定会话&sessionCreated(HttpSessionEvent se)。当会话无效时,该会话将被销毁&执行sessionDestroyed(HttpSessionEvent se)。在这种情况下,记录登录和注销时间戳将非常有效 但是,例如,用户已登录,但关闭了浏览器窗口。下次打开浏览器时,将生成一个新的会话id,用户需要再次登录。因此,该用户以前的登录注销记录将不完整,并且将在数据库中插入具有当前会话

我希望为用户记录登录和注销时间戳

我知道,一旦用户点击登录页面,就会创建一个新的浏览器特定会话&
sessionCreated(HttpSessionEvent se)
。当会话无效时,该会话将被销毁&执行
sessionDestroyed(HttpSessionEvent se)
。在这种情况下,记录登录和注销时间戳将非常有效

但是,例如,用户已登录,但关闭了浏览器窗口。下次打开浏览器时,将生成一个新的会话id,用户需要再次登录。因此,该用户以前的登录注销记录将不完整,并且将在数据库中插入具有当前会话id的新记录

我如何解决这个设计问题?我读了一些答案,其中讨论了AJAX轮询和JS onunload,但这些似乎不是一个可靠的解决方案

另外,在另一方面,是否有一种方法可以使会话保持活动状态,即使在浏览器关闭的情况下


提前感谢。

可以通过cookie在用户浏览器上记录会话。 它基本上允许用户重新登录到系统,而无需对自身进行身份验证。在这种情况下,您可以存储客户端再次打开浏览器时需要恢复的最低状态信息


但是会话id肯定会改变

除了超时之外,没有可靠的方法可以做到这一点:在X小时后让某些东西清理会话。至于在浏览器关闭时保持会话活动:您可以将会话令牌存储在持久cookie中(浏览器关闭时不会丢弃该令牌)。相关:这就是我所做的。我在
sessionCreated(HttpSessionEvent se)
中创建了两个属性“注销代码”和“登录”。将它们分别设置为0和FALSE。验证成功后,我将“登录”的值设置为TRUE,对于正常注销,我将“注销代码”的值设置为1。在
sessionDestroyed(HttpSessionEvent se)
内,我检查登录和注销代码的值。如果登录为TRUE,注销代码为1,则表示会话正常终止。如果登录为真,注销代码为0,则为异常。你能指出任何缺陷吗?为什么当cookie存在时会话id会改变?嘿,Amit,谢谢你的回答。但是,既然cookie是客户端组件,那么这是一种安全缺陷还是设计问题呢。即使浏览器关闭,您也要求会话保持活动状态。这是否会降低系统的安全性?对有权访问计算机(和用户帐户)的人可以选择此会话。是的,这就是我不想在浏览器关闭后使其保持活动状态的原因。我希望在浏览器关闭后立即销毁会话。有什么帮助吗?:)根本不要创建cookie。一旦浏览会话id关闭。会议将被破坏。