当一个浏览器选项卡关闭时,会话销毁

时间:2018-12-12 11:04:06

标签: php session

BackGround 我制作了一个Webapp,用户需要登录才能使用该Webapp中的功能。


我想在Session方面使其相当安全(以避免将Session打开)。我知道在关闭浏览器时(默认情况下,关闭所有Chrome标签),会话会被破坏。我还在注销按钮上添加了此PHP代码以销毁它。

<?php
session_start();
unset($_SESSION['username']);
unset($_SESSION['password']);
session_destroy();
header('location: somelocation');
?>

我的问题是,当用户仅关闭应用程序所在的浏览器选项卡时,会话不会被破坏,并且无需重新登录即可重新打开会话。因此,如果用户打开了YouTube(例如)标签,而他仅关闭了我的应用所在的标签,则会话不会被破坏。有一种方法可以检测到它并破坏会话? 我已经看过了: logout user when browser or tab is closeddestroy session when broswer tab closed但是他们没有回答我的问题。感谢您的建议。

3 个答案:

答案 0 :(得分:3)

我建议您应该对PHP函数进行AJAX调用,这将破坏会话。您在问题中编写的代码将起作用。但是有一个技巧可以发起AJAX调用。

当用户关闭浏览器选项卡时,将启动ajax并破坏会话。在这里,我展示了如何:

var flag_var = false;
function pageCleanup()
{
    if (!flag_var)
    {
        $.ajax({
            type: 'GET',
            async: false,
            url: 'SomeUrl.com/php_file.php',
            success: function ()
            {
                flag_var = true;
            }
        });
    }
}


$(window).on('beforeunload unload', function ()
{
    //this will work only for Chrome
    pageCleanup();
});

答案 1 :(得分:1)

由于客户端/服务器模型的性质,没有简单的方法可以执行所需的操作。如果用户在加载页面后可能会闲置一会儿,那么他也可以关闭标签并再次打开它。您无法控制客户端在客户端执行的操作。有简单的javascript方法可以做到这一点,例如unload event,但它们不可靠,而且通常不起作用。

您可以使用websockets来确保客户端始终处于连接状态或在后台执行多个ajax请求,并使会话中的超时保持几秒钟,但是如果用户的Internet连接断开,这些方法将断开用户的连接甚至一会儿。

答案 2 :(得分:0)

尽管用户仍在会话中处于活动状态,但会话超时存在细微差别。该问题与从不修改会话变量有关。

GC将根据其上次修改时间清除会话数据文件。因此,如果您从不修改会话,只需从中读取即可,GC最终将清除。

为防止这种情况,您需要确保在GC删除时间内修改了会话。您可以按以下方式完成此操作。

<?php 
if( !isset($_SESSION['last_access']) || (time() - $_SESSION['last_access']) > 60 ) 
  $_SESSION['last_access'] = time(); 
?> 

这将每60秒更新一次会话,以确保修改日期被更改。

引用PHP Session