PHP - 关闭浏览器后会话销毁

时间:2014-06-25 06:53:10

标签: php session cookies

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

我在配置文件中使用了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();

9 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

使用保持活力。

登录时:

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
}

答案 2 :(得分: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"]);

可能还有更多。

答案 3 :(得分:2)

这可能对您有帮助,

session_set_cookie_params(0);
session_start();

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

答案 4 :(得分:1)

您可以使用JavaScript触发ajax请求到服务器,以便在我们关闭浏览选项卡或窗口或浏览器时触发onb​​eforeunload事件上的会话。

答案 5 :(得分:1)

还有一个&#34; hack&#34;通过使用HTTP Referer(我们认为浏览器窗口已关闭当前引用者的域名和curent页面的域名不匹配):

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}

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

答案 6 :(得分:0)

使用以下代码销毁会话:

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

如果您对此怎么做感到困惑,请参阅 session_destroy()功能手册:

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

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