如何在关闭选项卡时强制注销用户

时间:2017-07-05 03:39:36

标签: javascript java web-applications

我正在使用spring和struts开发一个企业应用程序。但是,我在Tab关闭时遇到问题。如何在关闭浏览器选项卡时强制用户注销,或在另一个选项卡上打开同一页面。

我一直在尝试使用onbeforeunload,但在移动浏览器上运行应用程序时遇到问题。我也看过以下样本,但没有人有明确的解释。

How to kill session when user closed the browser without logout

How to Detect Browser Window /Tab Close Event?

是否有任何解决方案来使用javascript或从服务器实现此问题? 感谢

3 个答案:

答案 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"上调用它。正文和该脚本调用后端代码使用户会话无效。