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

PHP-关闭浏览器后销毁会话,php,session,cookies,Php,Session,Cookies,虽然这个问题有多处重复,但我找不到合适的解决方案。 我需要一些帮助 我使用了ini\u集('session.cookie\u life',0)在我的配置文件中 但这并不能帮助我在浏览器关闭时破坏会话 应用电流: 1) 在身份验证页面中,如果用户有效,则使用session\u regenerate\u id(true)生成新的会话标识符 2) 控件转到welcome.php,在那里我使用session_start()启动新会话 3) 注销页面中的代码为 $_SESSION = arra

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

我使用了
ini\u集('session.cookie\u life',0)在我的配置文件中

但这并不能帮助我在浏览器关闭时破坏会话

应用电流:

1) 在身份验证页面中,如果用户有效,则使用
session\u regenerate\u 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();
这可能对你有帮助

session_set_cookie_params(0);
session_start();

您的会话cookie将被销毁。。。因此,在浏览器打开之前,您的会话将一直正常。请查看这可能会对您有所帮助。

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

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

session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"];
}
  • 阿贾克斯
使用
onbeforeunload()
一个javascript函数,在用户离开页面时调用最后一个操作,使javascript执行一个将删除会话的ajax调用。但由于某些原因,这并不总是有效的

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

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

使用以下代码销毁会话:

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


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

您可以使用JavaScript来完成此操作,方法是触发对服务器的ajax请求,以在我们关闭浏览选项卡、窗口或浏览器时触发onbeforeunload事件来销毁会话。

使用保持活动状态

登录时:

session_start();
$_SESSION['last_action'] = time();
每隔几秒(如20秒)进行一次ajax调用:

服务器端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
}
session_start();
如果($_SESSION['last_action']
如果您不知道该做什么,请参阅会话销毁()的手册。功能:

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

使用HTTP Referer还有一个“黑客”攻击(我们发现浏览器窗口已关闭当前Referer的域名与当前页面的域名不匹配):


这也有一些缺点,但对我帮助不大。

如果要更改每次登录时的会话id,请确保在登录过程中使用会话重新生成id(true)

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


请详细说明。“销毁会话”实际上是什么意思?如果用户关闭浏览器,我想关闭现有会话。如果用户重新打开浏览器,我想再次向他发送登录页。“关闭现有会话”是什么意思?关闭浏览器永远不是销毁cookie会话的最佳方式,因为Web服务器永远不知道浏览器何时关闭。浏览器不会向服务器发送任何关闭通知,因此服务器无法发送删除cookie的命令,因为浏览器已关闭。提示,登录时取消选中“记住我”选项;p如果用户单击“注销”,则此操作正常。我认为Shri希望确保每次用户关闭浏览器时会话都会被破坏。会话在关闭浏览器时自动被破坏首先阅读问题这是一个适合小个子男人的解决方案。为什么?因为如果您更改会话,它需要在脚本末尾重写。如果你有一个大网站,那就需要大量的I/O来自动注销用户。@Umigo:你不需要将文件用作会话存储。PHP提供了例如Memcache作为替代方案。关于如何检查用户是在线还是离线(y)@colburton,即使在使用Memcache时;它仍然是I/O,有足够的用户,仍然会导致问题。此外,它可能会导致更多的请求,这些请求也需要由Web服务器处理,这也会消耗资源(无论您能够获得的资源多么小,都不会为零)。我宁愿重新评估一下,为什么要这么匆忙地破坏会话,而不是破坏扩展或在机器上造成“不必要”负载的可能性。这应该是最重要的答案
session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}
<?php
session_start();
session_regenerate_id(true);
?>