5

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

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

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

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

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

这是完全不可取的,因为我们需要加载 /session/logout 的正确结果——尤其是在用户试图做他们登录时无法做的事情的情况下(在这种情况下,302 从注销将指向他们最初试图去的地方)。

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

4

1 回答 1

0

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

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

于 2012-06-13T12:52:50.893 回答