0

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

任何帮助,将不胜感激。

4

3 回答 3

2

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

我建议从客户端发出某种心跳 Ajax 呼叫,比如每五分钟一次。如果您连续错过两个这样的调用,您将终止会话服务器端。这将处理用户未注销的所有情况(浏览器崩溃、操作系统崩溃、网络故障等)。

作用于卸载事件的潜在问题:

  • 如果用户在多个选项卡中打开您的应用程序/网站并关闭其中一个,会发生什么情况?您需要通知用户将进行交叉表注销。
  • 浏览器有限制您在卸载时可以执行的操作的历史,以防止出现阻止用户关闭浏览器的弹出窗口和无限循环。你永远不知道未来会发生什么。这里的历史:http : //www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript 并通过上面回复中的 StackOverflow 链接。
于 2012-04-16T12:51:27.763 回答
0

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

手头的任务是使用Ext-state-CookieProvider. 完全省略expires配置,将导致 ExtJS 将其默认为 7 天。检查来源。因此,您需要使用显式expiresnull 创建 cookie,如下所示:

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

当浏览器关闭时,所有 cookie 值都将被删除。

于 2014-09-22T14:14:07.683 回答
0

根据这个答案,您应该能够处理该beforeunload事件,然后执行 AJAX 注销。

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

Ext.EventManager.on(window, 'beforeunload', function() {
  Ext.Ajax.request({
    url: 'logout.json',
    timeout: 60000
  });
});
于 2012-04-14T10:01:28.530 回答