2012-06-12 80 views
5

所以,我遇到了一个奇怪的问题,我希望有一些IE浏览器可以帮助我们了解这种行为。我的公司运行实时升降机应用程序。我们使用彗星模型实现浏览器和服务器之间的实时通信,就像Lift的标准一样。另外值得注意的是:如果彗星与服务器不同步(无论是因为连接问题还是服务器重启,任何可能导致服务器终止会话的事件),服务器都会通过document.location.reload();响应该彗星请求来重新加载页面,启动一个新的会话,等等。IE收到302后继续执行JS?

现在,为了确保注销按他们应该的方式发生,我们有一个特殊的url(/ session/logout),它会执行所有与会话有关的清理操作,然后将您带回到我们的主页。这可以通过点击该URL的锚点来触发,或者如果您尝试执行某些要求您注销的内容,则服务器可能会向您发送该URL的302。很简单,对吗?

  1. 用户无论点击退出按钮或服务器发送一个302 /会话/注销
  2. 当前页面上
  3. 的Javascript运行停止,所以:在大多数浏览器,因为工作流程看起来像这样这样的伟大工程所有的彗星都关闭了。
  4. 浏览器加载/会话/注销
  5. 浏览器从服务器收到302消息(表示会话清理已完成)以将用户踢到主页。
  6. 浏览器加载主页。

然而,在IE中我们看到以下行为:

  1. 用户无论点击退出按钮或服务器发送一个302 /会话/注销
  2. 浏览器开始加载/会话/注销
  3. 浏览器从服务器收到302消息(表示会话清理已完成)以将用户踢到主页。
  4. 浏览器开始加载主页。
  5. 彗星从服务器接收document.location.reload();,因为他们从来没有关闭通过IE浏览器,网页的加载被中止,而当前页面没有登录的用户重新加载。

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

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

+0

什么版本的IE?标准模式与否? – joshp

+0

IE 8和IE 9都运行在标准模式下,表现出这种行为。 –

回答

0

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

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

+0

不幸的是,这不起作用。这似乎是因为IE已经决定它实际上并不想去一个不同的页面,onBeforeUnload没有被调用,我仍然看到重载行为。 :( –