【问题标题】:PHP - Session destroy after closing browserPHP - 关闭浏览器后会话销毁
【发布时间】:2014-08-15 15:00:48
【问题描述】:

虽然这个问题有多个重复项,但我找不到适合我的解决方案。 需要一些帮助。

我在我的配置文件中使用了ini_set('session.cookie_lifetime', 0);

但这并没有帮助我在浏览器关闭时销毁会话。

应用电流:

1) 在认证页面如果用户有效,使用session_regenerate_id(true);生成新的会话标识符

2) 控制权转到welcome.php,我使用session_start(); 开始新会话

3) 在注销页面代码是

      $_SESSION = array();
      if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     }
    // Finally, destroy the session.
    session_destroy();

【问题讨论】:

  • 请详细说明。 “销毁会话”实际上是什么意思?
  • 如果用户关闭浏览器,我想关闭现有会话。如果用户重新打开浏览器,我想再次向他发送登录页面。
  • “关闭现有会话”是什么意思?
  • 关闭浏览器绝不是破坏 cookie 会话的最佳方式,因为网络服务器永远不知道浏览器何时关闭。浏览器不会向服务器发送任何它正在关闭的通知,因此服务器无法发送删除 cookie 的命令,因为浏览器已关闭。
  • 提示,登录时取消选中记住我选项。;p

标签: php session cookies


【解决方案1】:

这可能对你有帮助,

session_set_cookie_params(0);
session_start();

您的会话 cookie 将被销毁...因此您的会话将保持良好状态,直到浏览器打开。请查看http://www.php.net//manual/en/function.session-set-cookie-params.php这可能会对您有所帮助。

【讨论】:

  • 这应该是最佳答案
【解决方案2】:

使用保活。

登录时:

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
}

【讨论】:

  • 这是小人的解决方案。为什么?因为如果您更改会话,则需要在脚本末尾重写。如果您有一个大型网站,那么仅用于自动注销用户就需要大量 I/O。
  • @Umigo:您不需要将文件用作会话存储。 PHP 提供了例如 Memcache 作为替代方案。
  • 关于如何检查用户是否在线或离线(y)的最佳和最简单的答案
  • @colburton 即使在使用 Memcache 时;它仍然是 I/O,如果有足够的用户,仍然会引起问题。此外,它可能会导致更多 also 需要由网络服务器处理的请求,这 also 会消耗资源(无论您获得多少资源) ,它不会为零)。我宁愿重新评估为什么要如此匆忙地销毁会话,而不是损害扩展或在机器上造成“不必要”负载的可能性。
【解决方案3】:

关闭会话的最佳方法是:如果在特定时间间隔后该会话没有响应。然后关闭。请看这篇文章,我希望它能解决这个问题。 "How to change the session timeout in PHP?"

【讨论】:

    【解决方案4】:

    有不同的方法可以做到这一点,但服务器无法检测到浏览器何时关闭,因此很难销毁它。

    • 会话超时。

    要么使用当前时间创建新会话,要么将时间变量添加到当前会话。然后在启动或执行操作时检查它是否必须删除会话。

    session_start();
    $_SESSION["timeout"] = time();
    //if 100 seconds have passed since creating session delete it.
    if(time() - $_SESSION["timeout"] > 100){ 
        unset($_SESSION["timeout"];
    }
    
    • ajax

    使 javascript 执行将删除会话的 ajax 调用,使用 onbeforeunload() 一个 javascript 函数在用户离开页面时调用最终操作。出于某种原因,这并不总是有效。

    • 在启动时将其删除。

    如果您总是希望用户在页面关闭后在启动时看到登录页面,您可以在启动时删除会话。

    <? php
    session_start();
    unset($_SESSION["session"]);
    

    可能还有更多。

    【讨论】:

      【解决方案5】:

      使用HTTP Referer还有一个“hack”(我们假设浏览器窗口关闭了当前referer的域名和当前页面的域名不匹配):

      session_start();
      $_SESSION['somevariable'] = 'somevalue';
      
      if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"]){
          session_destroy();
      }
      

      这也有一些缺点,但它帮助了我几次。

      【讨论】:

        【解决方案6】:

        您可以使用 JavaScript 通过触发对服务器的 ajax 请求来销毁在我们关闭浏览选项卡或窗口或浏览器时触发的 onbeforeunload 事件上的会话。

        【讨论】:

          【解决方案7】:

          使用以下代码销毁会话:

           <?php
              session_start();
              unset($_SESSION['sessionvariable']);
              header("Location:index.php");
              ?>
          

          【讨论】:

          • 如果用户点击注销就可以了。我认为 Shri 想要确保会话在用户关闭浏览器时被销毁。
          • 会话在关闭浏览器时自动销毁
          • 先阅读问题
          【解决方案8】:

          如果您想在每次登录时更改会话 id,请确保在登录过程中使用 session_regenerate_id(true)。

          <?php
          session_start();
          session_regenerate_id(true);
          ?> 
          

          【讨论】:

            【解决方案9】:

            如果你不知道该怎么做,只需参考 session_destroy() 函数的手册:

            http://php.net/manual/en/function.session-destroy.php

            在那里您可以找到 session_destroy() 的更多功能。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-07-29
              • 2015-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多