【问题标题】:How to force logout user when close tab关闭选项卡时如何强制注销用户
【发布时间】:2017-12-08 13:20:51
【问题描述】:

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

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

How to kill session when user closed the browser without logout

How to Detect Browser Window /Tab Close Event?

有没有使用javascript或从服务器解决这个问题的解决方案? 谢谢

【问题讨论】:

标签: javascript java web-applications


【解决方案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/logout。

【讨论】:

  • 我正在为我的令牌使用 HttpOnly cookie,但我将 loginInfo 存储在 localStorage 中以允许浏览器刷新。由于此解决方案,我刚刚将其移动到SessionStorage,现在在关闭选项卡/浏览器时用户已正确注销。是时候重写一堆旧东西了!
【解决方案2】:

您可能有一个 javascript 函数并在正文的“onunload”上调用它,并在该脚本中调用后端代码以使用户会话无效。

【讨论】:

    【解决方案3】:

    您可以通过页面onload 发起一个ajax 请求,并从服务器获取跟踪会话ID/序列号。
    稍后强制所有请求操作包括您刚刚使用上面的 ajax 调用为页面提供的跟踪会话。

    如果用户打开一个新选项卡,ajax 加载将再次开始。并且只要您检查服务器中与关联用户的实时会话轨迹,您可以将用户重定向到其他地方等。

    我不认为你可以依赖onbeforeunload,就像你经历的一样。

    正如其他人所说,http 是无状态的,cookie 和请求只是您可以检查用户状态的东西。

    在服务器上,会话 cookie 可能会因会话超时而失效(如果我们假设用户要煮一些咖啡,例如它会关闭页面/标签)。
    如上述解决方案所述,如果他/她打开一个新选项卡,新的 ajax 调用可能会阻止他/她执行新的登录等。

    我建议您可能会找到另一种解决方案,而不是您试图获得的这种方法。将页面状态与上次打开的页面同步更容易也更有意义。让用户打开5个相同的页面,然后将它们全部同步(最简单的解决方案:更新时刷新其他页面)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多