【问题标题】:How do I design my Java Web App such that the session gets terminated when browser is closed?如何设计我的 Java Web 应用程序,以便在关闭浏览器时终止会话?
【发布时间】: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


【解决方案1】:

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

但会话 ID 肯定会改变。

【讨论】:

  • 为什么 cookie 存在时会话 id 会改变?
  • 嘿阿米特,谢谢你的回答。但既然 cookie 是客户端组件,那会是一种安全漏洞还是设计问题?
  • 回复:安全漏洞。即使浏览器关闭,您也要求会话保持活动状态。这会降低系统的安全性吗?是的。有权访问计算机(和用户帐户)的人可以接听此会话。
  • 是的,这就是我不想在浏览器关闭后让它保持活动状态的原因。我希望在浏览器关闭后立即销毁会话。有什么帮助吗? :)
  • 根本不创建cookie。一旦浏览会话 id 关闭。会话将被销毁。
猜你喜欢
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
相关资源
最近更新 更多