IE收到302后继续执行JS?

Mat*_*mer 5 javascript internet-explorer comet lift

所以,我遇到了一个奇怪的问题,我希望有一些IE专家能够对这种行为有所了解.我的公司运行一个实时的Lift应用程序.我们使用彗星模型在浏览器和服务器之间进行实时通信,这是Lift的标准配置.另外值得注意的是:如果彗星与服务器不同步(由于连接问题或服务器重启,任何会导致服务器上的会话中断的事情)服务器响应该彗星请求,document.location.reload();并重新加载页面,启动一个新的会话,等等.

现在,为了确保注销按预期发生,我们有一个特殊的URL(/ session/logout),可以完成所有与会话相关的清理,然后将您踢回我们的主页.这可以通过单击该URL的锚点来触发,或者如果您尝试执行需要注销的操作,服务器可能会向您发出302该URL.很简单吧?在大多数浏览器中,这很有用,因为工作流看起来像这样:

  1. 用户单击注销按钮或服务器发送302到/ session/logout
  2. 当前页面上的Javascript执行停止,因此所有彗星都会关闭.
  3. 浏览器加载/会话/注销
  4. 浏览器从服务器收到302消息(表示会话清理已完成)以将用户踢到主页.
  5. 浏览器加载主页.

但是,在IE中我们看到以下行为:

  1. 用户单击注销按钮或服务器发送302到/ session/logout
  2. 浏览器开始加载/会话/注销
  3. 浏览器收到来自服务器的302消息(表示已完成会话清理)以将用户踢到主页.
  4. 浏览器开始加载主页.
  5. Comets document.location.reload();从服务器接收a ,因为它们从未被IE关闭,主页的加载被中止,并且当前页面在没有用户登录的情况下重新加载.

这是完全不合需要的,因为我们需要加载/ session/logout的正确结果 - 特别是在用户尝试执行他们登录时无法执行的操作的情况下(在这种情况下,302从注销将指向他们最初试图去的地方).

以前有没有人遇到过这种问题?关于如何处理这个问题的任何建议?

Jas*_*mer 0

具体来说,我对彗星一无所知,但你应该更明确地关闭彗星。

我建议捕获 window.onbeforeunload 事件并显式关闭 comet,而不是依赖浏览器为您完成这项工作。