【问题标题】:Destroy Session on Browser or Tab Close: Working for Firefox but not for Chrome销毁浏览器或选项卡关闭上的会话:适用于 Firefox,但不适用于 Chrome
【发布时间】:2019-09-03 14:48:25
【问题描述】:

我有一个要求,当用户打开网站时关闭浏览器后,它应该默认要求登录。

我在注销按钮上销毁了会话值,因此当用户单击注销按钮时它可以正常工作,但如果用户直接关闭浏览器或选项卡,会话不会被破坏。

我也尝试将 session.cookie_lifetime 值设置为 0,但它不起作用。

【问题讨论】:

标签: php jquery


【解决方案1】:

在我看来,最好的方法是存储带有时间的会话,您可以创建一个 JavaScript 心跳,它会保持每 x 秒更新一次时间,并且看起来像现在这样的时间永远不会超过时间+x 秒,然后你就会有你的心跳。如果时间超过它,会话将超时,您将退出比赛。

登录时:

session_start();
$_SESSION['last_action'] = time();

每隔几秒(例如 20 秒)调用一次 ajax:

windows.setInterval(keepAliveCall, 20000);

服务器端keepalive.php:

session_start();
$_SESSION['last_action'] = time();

关于其他所有操作:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) {
  // destroy the session and quit
}

【讨论】:

  • 谢谢,但这不是我所关心的解决方案。我正在寻找用户关闭浏览器会话应该被破坏。它在没有任何额外代码的情况下在 Firefox 上运行良好,但在 Chrome 上无法运行。
【解决方案2】:

浏览器是网络标准的实现。他们之间在如何选择他们决定实施它们方面存在差异,有时可能与标准不同。

如果您设置了会话/临时 cookie,则应该是在网站关闭后立即将其删除。但是,浏览器并不总是将其视为信条。它们具有方便的功能,可以保留 cookie 并恢复用户的会话。如果浏览器突然崩溃或用户不小心关闭了选项卡,这可能很有用。

另一方面,对于开发人员来说,这会造成干预,这不是他们应有的行为方式。这不是可以控制的事情,所以当标签关闭时你不能真正删除 cookie。解决它的唯一方法是在会话或另一个 cookie 中存储时间戳,并且在加载页面的任何时候,检查是否经过了合理的时间戳,在这种情况下,cookie 可能会被销毁。这不是一个理想的解决方案,但它是在现代浏览器中实现它的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多