关闭浏览器标签时销毁会话

7

我有一个用户登录/注销应用程序: 当我关闭浏览器(所有标签),IE和Firefox都可以正常销毁会话。 但是我希望在用户关闭单个选项卡时销毁会话。 我正在使用:

session_set_cookie_params(0);
session_start();
3个回答

21

当整个浏览器进程退出时,浏览器才会销毁会话cookie。没有可靠的方法可以确定用户何时关闭了选项卡。您可以附加一个 onbeforeunload 处理程序,并希望成功地向服务器发出ajax调用以指示选项卡关闭,但这不是可靠的。

如果用户在您的站点上打开了两个或更多选项卡,则会发生什么情况?如果他们关闭一个选项卡,另一个选项卡将有效地注销,即使用户完全打算继续使用您的站点。


但是 onbeforeunload 也会在用户刷新页面时起作用,我希望在用户关闭浏览器或关闭选项卡时销毁会话。 - beginner web developer
1
你在评论之前已经详细地覆盖了我想要评论的每个点,做得非常好。 - Fabrício Matté
1
@beginnerwebdeveloper:就像我说的那样,你无法百分之百地可靠地做到这一点。 - Marc B

3
解决方案是使用自己的方法实现会话超时。使用一个简单的时间戳来表示上次请求的时间,并在每个请求时更新它:
你需要编写类似于以下代码的内容:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // request 30 minates ago
    session_destroy();
    session_unset();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time

您可以在这里找到更多相关信息,与您的问题类似:如何在用户关闭浏览器而不点击注销时销毁或取消设置会话

它涵盖了您所需的所有内容。


-3

这个链接非常有用

但是你需要在函数endsession的结尾添加代码,它是JavaScript函数,你可以使用ajax调用logout.php来实现。这对我很有效:

$.ajax({
    url:"logout.php",
    method:'POST',
    contentType:false,
    processData:false,
    success:function(data)
    {
        alert("session destroyed");
    }
});

这并没有解决问题中关于“当标签页关闭时”的部分。 - Quentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接