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

Posted

技术标签:

【中文标题】当浏览器关闭时,是不是有可靠的方法来注销用户?【英文标题】:Is there a reliable way to log a user out when the browser is closed?当浏览器关闭时,是否有可靠的方法来注销用户? 【发布时间】:2011-07-14 15:09:48 【问题描述】:

我正在寻找一种可靠的方法来注销用户或在浏览器关闭时放弃他们的会话。有没有办法用选项卡式浏览器做到这一点?任何建议表示赞赏。谢谢!

【问题讨论】:

使用仅会话 cookie,它只保留浏览会话的长度(即直到用户关闭浏览器)。 【参考方案1】:

当客户端关闭浏览器时,没有可靠的方法立即执行此操作。有 beforeunload 事件,但即便如此,当您在此事件期间触发 ajax 请求时,也不能保证永远到达服务器。尽管如此,您还是遇到了多个浏览器选项卡的问题。

最可靠的方法是在服务器端设置一个相对较短的会话超时时间(例如 1 分钟)并在客户端引入一个基于 ajax 的心跳(例如每 30 秒)以保持会话处于活动状态。

根据您认为这是解决方案的唯一功能要求,可能会有更好的方法。例如,如果您的 实际 意图是将所有登录限制为每个注册用户 1 次,那么您最好收集所有登录和相关会话,然后在每次登录时进行比较,并在以下情况下使之前的会话无效任何礼物。这样,它在禁用 JS 的客户端上也能正常工作。

【讨论】:

【参考方案2】:

如果您不使用 cookie 来保存用户的登录信息,它应该在他们关闭浏览器时将其注销,因为在浏览器关闭时应该终止所有会话 cookie。 p>

显然情况并非总是如此(see here for an example Firefox 在注销后保留登录信息),因为“会话恢复”功能现在模糊了“单一浏览器会话”之间的界限。 (我个人认为这应该归类为错误,但这只是我的意见)。

有两种可能的技术。第一个是(正如 yojimbo87 在我之前提到的)使用 Web 套接字来保持客户端和服务器之间的连接,当套接字关闭时,终止会话。这里的问题是 Web 套接字支持是有限的,除了最前沿的浏览器(FF4、Chrome、IE9 等)之外,当然不可能。

另一种方法是使用 AJAX 不断轮询服务器,告诉它该页面仍在被查看,因此,例如,如果您每 30 秒通过 AJAX 发送一个保持活动请求,您将存储会话中请求的时间戳。如果用户然后返回页面并且当前请求和最后一个请求之间的时间差超过... 45 秒(考虑延迟),您就会知道用户关闭了浏览器并需要登录又进来了。

在这两种情况下,都有一个致命的缺陷,那就是它们依赖于 javascript。如果用户没有启用 JavaScript,你最终会因为不断的登录提示而破坏用户体验,这显然是个坏主意。

在我看来,我认为当用户关闭浏览器窗口时,仅仅依靠浏览器删除会话 cookie 是合理的,因为这是他们应该做的。当客户端浏览器执行不良行为时,您作为开发人员不能受到责备,因为它完全不在您的掌控之中,并且没有功能性的解决方法。

【讨论】:

【参考方案3】:

一种可行的技术是使用 AJAX 经常向您的服务器发送保持活动请求 - 例如每隔一分钟。然后,您可以在未按预期接收到 keep-alive(或连续几个)时立即放弃会话。

否则,没有可靠的方法来实现这一目标。由于浏览器和服务器之间没有持久连接,因此您无法检测到您可能在浏览器中运行的任何 JavaScript 代码失控的情况。例如,当出现网络故障时,即使浏览器的窗口仍处于打开状态,您也可能希望关闭会话。因此,为了使系统足够健壮,您应该将网络中断检测为浏览器保持活动机制的“副作用”(例如 Gmail 就是这样做的)。

【讨论】:

【参考方案4】:

除非您使用 WebSockets 或对“实时”跟踪与客户端连接的每个选项卡使用某种长轮询,否则您可能必须等到服务器端的会话超时。

【讨论】:

【参考方案5】:

您可以通过结合使用 Jquery、Ajax 和 php 来实现 jQuery

  function updatestatusOFF()
        // Assuming we have #shoutbox
        $('#connection').load('connection.php?user=<?php echo $_SESSION['username']; ?>&offline=true');

    

卸载前脚本

<script>window.onbeforeunload = function()  return updatestatusOFF(); </script>

还有你必须自己编写的 php,我更确定你可以做到。 它不是最可靠的,但它是实现它的最简单方法。如果你想要实时报告.. 看看彗星

【讨论】:

以上是关于当浏览器关闭时,是不是有可靠的方法来注销用户?的主要内容,如果未能解决你的问题,请参考以下文章

定时自动注销和浏览器关闭

当用户关闭浏览器或选项卡而不注销时如何将用户标记为离线

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

关闭浏览器时用户在 IE 中注销

在浏览器关闭时注销

在浏览器关闭 PHP/MySQL 时将用户从数据库中注销