如何在浏览器关闭时结束会话

时间:2012-04-14 09:47:43

标签: session cookies extjs

在我的应用程序中,我正在保存用户的注销时间。当用户单击登录按钮时,这工作正常,但我的要求是即使用户关闭浏览器也要存储注销时间。如果无法做到这一点,请告诉我如何在用户关闭窗口后立即销毁会话。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

过去你必须在事件处理程序中执行 synchronous Ajax。不知道在现代浏览器中是否仍然如此。如果您是异步的,请确保使用真实的客户端负载进行测试,这样您就不会遇到仅在用户中出现的竞争条件。

我建议每隔五分钟从客户那里得到一些心跳的Ajax电话。如果连续错过两个这样的调用,则会终止会话服务器端。这将解决用户未注销的所有情况(浏览器崩溃,操作系统崩溃,网络故障等)。

处理卸载事件的潜在问题:

  • 如果用户让您的应用/网站打开多个标签并关闭其中一个,会发生什么?您需要通知用户将有一个交叉表注销。
  • 浏览器对卸载时可以执行的操作有限制,以防止永久弹出和无限循环阻止用户关闭浏览器。你永远不知道将来会发生什么。历史记录:http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript并通过上面回复中的StackOverflow链接。

答案 1 :(得分:0)

根据this answer,您应该能够处理beforeunload事件,然后执行AJAX注销。

未经测试,但它应该像这样工作:

Ext.EventManager.on(window, 'beforeunload', function() {
  Ext.Ajax.request({
    url: 'logout.json',
    timeout: 60000
  });
});

答案 2 :(得分:0)

这回答了问题的最后部分。关闭浏览器时自动关闭会话。根据{{​​3}}:如果在创建cookie时未设置到期日期或有效期间隔,则会创建会话cookie。当用户关闭浏览器时,Web浏览器通常会删除会话cookie。

手头的任务是使用Ext-state-CookieProvider创建一个没有过期日期的cookie。完全忽略expires配置,将导致ExtJS将其默认为7天。请检查Wikipedia。因此,您需要使用明确的expires null创建cookie,如下所示:

var cp = Ext.create('Ext.state.CookieProvider', {
    expires: null
});

浏览器关闭时,将删除所有Cookie值。