浏览器关闭时是否有可靠的方法将用户注销?

时间:2011-03-13 21:23:01

标签: javascript asp.net session asp.net-membership

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

5 个答案:

答案 0 :(得分:10)

当客户端关闭浏览器时,没有可靠的方法立即执行 。有beforeunload事件,但即使这样,当您在此事件期间触发ajax请求时,也无法保证到达服务器。然而,您仍然遇到多个浏览器标签的问题。

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

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

答案 1 :(得分:2)

如果您没有使用Cookie来保存用户的登录信息,那么应该在关闭浏览器时将其注销,因为浏览器关闭时应该终止任何会话Cookie。

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

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

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

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

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

答案 2 :(得分:1)

一种可行的技术是使用AJAX经常向您的服务器发送保持活动请求 - 例如每一分钟。然后,只要未按预期收到保持活动(或少数序列),您就可以放弃会话。

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以通过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你必须自己写,我更确定你可以做。 它不是最可靠的,但它是实现它的最简单方法。如果你想要实时报道..看看彗星