【问题标题】:Session Destroy when one browser tab gets closed关闭一个浏览器选项卡时销毁会话
【发布时间】:2019-05-13 11:24:55
【问题描述】:

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 但他们没有回答我的问题。感谢您的建议。

【问题讨论】:

  • javascript it - 在窗口卸载 - 运行 php 脚本

标签: php session


【解决方案1】:

我建议您对 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();
});

【讨论】:

  • 非常感谢!我会试一试,但到目前为止它看起来不错。真的很有帮助!
  • 请注意,unloadbeforeunload 事件是不可靠的,并且不会始终有效。即使在这里快速搜索,您也会发现很多关于它的投诉。
  • @EnricoDias 是的,我读到了,但是据我了解,除了按照您的建议使用 API 之外,没有真正可靠的方法
【解决方案2】:

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

您可以使用websockets 来确保客户端始终处于连接状态,或者在后台执行多个 ajax 请求并在会话中保持几秒钟的超时时间,但是如果用户的 Internet 连接中断,即使在片刻。

【讨论】:

    【解决方案3】:

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

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

    为防止这种情况发生,您需要确保在 GC 删除时间内修改会话。您可以像下面这样完成此操作。

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

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

    参考PHP Session

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2016-11-08
      • 2015-12-13
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多