【发布时间】:2017-12-01 18:06:54
【问题描述】:
我开发了一个 servlet jsp 应用程序。我正在使用 JSP、Java-Servlet 和 ajax。会话也使用。如果我从一个选项卡注销,如何从其他选项卡注销并刷新其他选项卡中的页面。请帮忙。
【问题讨论】:
我开发了一个 servlet jsp 应用程序。我正在使用 JSP、Java-Servlet 和 ajax。会话也使用。如果我从一个选项卡注销,如何从其他选项卡注销并刷新其他选项卡中的页面。请帮忙。
【问题讨论】:
为了实现这一点,首先我们不应该使用 cookie 来存储任何敏感数据,例如身份验证令牌。即使会话 cookie 也不够用,因为它会在关闭选项卡后甚至在完全关闭浏览器后继续存在。
这让我们将令牌保存在内存或 sessionStorage 中。 sessionStorage 的好处是它会在不同的页面和浏览器刷新之间持续存在。因此,用户可以导航到不同的页面和/或刷新页面并仍然保持登录状态。
有一种机制可以利用浏览器 sessionStorage 或 memoryStorage 的安全特性进行身份验证,并且仍然允许用户打开多个选项卡,而无需每次都重新登录。
相关浏览器存储机制的复习
localStorage ~5MB,无限保存或直到用户手动删除它。 sessionStorage ~5MB,在当前标签的生命周期内保存 cookie ~4KB,可以保存到无穷大 会话 cookie ~4KB,当用户关闭浏览器时删除(并不总是删除)
在标签之间共享 memoryStorage 以实现安全的多标签身份验证
所以……这将是在浏览器会话中保留身份验证令牌的唯一真正安全的方法,并且允许用户打开多个选项卡而无需重新登录
关闭选项卡,会话就消失了——这次是真的。
【讨论】:
我们可以使用 Storage 事件在 localStorage 值发生更改时得到通知。
function storageChange (event) {
if(event.key === 'logged_in') {
alert('Logged in: ' + event.newValue)
}
}
window.addEventListener('storage', storageChange, false);
例如,如果其中一个选项卡注销,则将 false 设置为 logged_in,如下所示:
window.localStorage.setItem('logged_in', false)
然后所有其他选项卡都会收到一个StorageEvent,并且会出现一个警报:
Logged in: false
这里实际上当 localStorage 获取更改侦听器时被调用。 然后您可以编写自己的代码来注销会话。并重新加载到登录页面。
【讨论】: