当用户关闭浏览器而不单击注销时销毁或取消设置会话[重复]

Posted

技术标签:

【中文标题】当用户关闭浏览器而不单击注销时销毁或取消设置会话[重复]【英文标题】:Destroy or unset session when user close the browser without clicking on logout [duplicate] 【发布时间】:2011-02-19 20:45:47 【问题描述】:

可能重复:How do I expire a php session after 30 minutes?

我正在销毁 logout.php 中的所有会话 var 并在用户单击注销时调用它,什么是用户不单击 logout.php 而是直接关闭浏览器。那我怎么删除会话???

【问题讨论】:

重复:***.com/questions/2201750/…,***.com/questions/2171821/…,***.com/questions/959655/… 和更多:***.com/search?q=php+session+browser+close 感谢您的回复,会话超时的语法在哪里以及是什么。 另见:***.com/questions/887919、***.com/questions/520237 和 ***.com/questions/508959 【参考方案1】:

您可以为会话数据设置过期时间,使用每个session_start 调用对其进行测试,如果会话过期则销毁会话:

session_start();
if (!isset($_SESSION['EXPIRES']) || $_SESSION['EXPIRES'] < time()+3600) 
    session_destroy();
    $_SESSION = array();

$_SESSION['EXPIRES'] = time() + 3600;

【讨论】:

这是一个有点尴尬的解决方案,你不觉得吗?有一个内置函数! $_SESSION['EXPIRES'] ....'EXPIRES' 是特定的,或者我可以放置我的会话变量名称?? @GuidoH:您最好检查一下session_cache_expire 的实际作用。 好的,但是如何启动会话,因为浏览器已关闭,因此会话 cookie(即会话 cookie)现在在客户端上被销毁? 这个答案没有解决OP的问题。问题是:如何在关闭浏览器时销毁会话,而不是在延迟后销毁会话。【参考方案2】:

你不能。但是,会话 cookie 通常在没有过期时间的情况下发送,这意味着它们会在浏览器关闭时被删除,因此会话无论如何都会丢失。

【讨论】:

有什么消息可以避免这个问题吗?【参考方案3】:

如果您不修改会话 Cookie 的到期时间,则 PHP 会话应在浏览器窗口关闭时自动到期。如果没有发生这种情况,那么我会假设您已经以某种方式对此进行了修改,我们需要更多详细信息来提供帮助。

【讨论】:

【参考方案4】:

可以将会话设置为简单地过期,服务器在一段时间后不会收到客户端的消息。这就是你要寻找的方向......

马丁

【讨论】:

【参考方案5】:

如果您没有为会话 cookie 设置过期时间,它将在用户关闭浏览器时被删除,这对于大多数实际用途具有相同的效果(除非您担心存储或安全性)。如果这还不够好,您可以将会话设置为很快过期并通过 AJAX 定期刷新它们。

【讨论】:

以上是关于当用户关闭浏览器而不单击注销时销毁或取消设置会话[重复]的主要内容,如果未能解决你的问题,请参考以下文章

会话销毁或关闭浏览器选项卡或关闭浏览器后,使用Laravel 5.2执行注销

当浏览器关闭时,是不是有可靠的方法来注销用户?

使用 asp.net 中的会话从帐户注销时遇到问题

在会话自动销毁之前调用自定义方法

在注销期间破坏用户会话是不是足够?

单击浏览器的后退按钮时如何销毁会话