繁体   English   中英

在浏览器或选项卡关闭上销毁会话:适用于Firefox,但不适用于Chrome

[英]Destroy Session on Browser or Tab Close: Working for Firefox but not for Chrome

我有一个要求,当用户打开站点时关闭浏览器后,默认情况下应要求登录。

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

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

我认为,执行此操作的最佳方法是将会话与时间存储在一起,您可以创建一个Javascript心跳,该心跳将使时间每x秒更新一次,并且看起来现在从来没有比time + 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
}

浏览器是Web标准的实现。 他们在选择执行决策的方式方面存在差异,有时可能会与标准有所不同。

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

另一方面,对于开发人员而言,这会造成干预,而这并非开发人员的行为方式。 这不是可以控制的事情,因此在关闭选项卡时您无法真正删除cookie。 解决该问题的唯一方法是将时间戳存储在会话或另一个Cookie中,并且无论何时加载页面,请检查是否经过了合理的时间戳,在这种情况下,该cookie可能会被破坏。 这不是理想的解决方案,但这是在现代浏览器中实现它的唯一方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM