我正在使用spring和struts开发一个企业应用程序。但是,我在Tab关闭时遇到问题。如何在关闭浏览器选项卡时强制用户注销,或在另一个选项卡上打开同一页面。
我一直在尝试使用onbeforeunload
,但在移动浏览器上运行应用程序时遇到问题。我也看过以下样本,但没有人有明确的解释。
How to kill session when user closed the browser without logout
How to Detect Browser Window /Tab Close Event?
是否有任何解决方案来使用javascript或从服务器实现此问题?
感谢
答案 0 :(得分:1)
最后,我找到了一个可行的解决方案!
用户登录时,我使用sessionStorage存储该用户已登录:
sessionStorage.setItem('logged', true)
SessionStorage
将保留该属性,直到选项卡或浏览器关闭。
因此,在应用程序内部,我检查SessionStorage是否仍然拥有该属性。如果没有,那么我注销用户,然后将他重定向到登录名。
if (!sessionStorage.getItem('logged')) {
localStorage.removeItem('token')
navigator.sendBeacon('api/logout')
window.location.replace("/login") //redirect to login
}
对于那些想知道navigator.sendBeacon
是什么的人,您可以阅读here to learn more。实际上,我使用它是因为我希望即使选项卡关闭,也可以访问api /注销。
答案 1 :(得分:0)
您可以按页面onload
启动ajax请求,并从服务器获取跟踪会话ID / serial。
稍后强制所有请求操作包括您刚刚使用上面的ajax调用给页面的跟踪会话。
如果用户打开新标签页,则会再次启动ajax加载。并且,如果您检查服务器中的关联用户的实时会话跟踪,您可以将用户重定向到其他地方等等。
我认为你可能不会依赖onbeforeunload
,就像你经历的那样。
正如其他人所说,http是无状态的,而cookie和请求只是你可以检查用户状态的东西。
在服务器上,会话cookie可能会被会话超时无效(如果我们假设用户要煮咖啡,例如关闭页面/标签)。
如上述解决方案所述,如果他/她打开一个新标签,新的ajax调用可能会阻止他/她执行新的登录等。
我建议您可以找到另一种解决方案,而不是您想要获得的这种方法。将页面状态与最后打开的页面同步更容易,更有意义。让用户打开5个相同的页面,然后将它们全部相互同步(最简单的解决方案:在更新时刷新其他页面)
答案 2 :(得分:0)
你可能有一个javascript函数并在" onunload"上调用它。正文和该脚本调用后端代码使用户会话无效。