Firefox XMLHttpRequest在302响应上设置错误标志

时间:2009-12-17 20:58:23

标签: javascript firefox xmlhttprequest

我有一个由servlet驱动的Web应用程序,通过重定向到登录页面,在一段时间不活动后超时用户会话。我在Web客户端上有代码,检查了这一点,基本上类似于以下内容:

function error(request, errtype) {
    if (request.status == 302) {
        // Display a "timed out" dialog, then:
        window.location = request.getResponseHeader("Location");
    }
}

然而,最近这个计划停止了工作;在超时时,request.status为0.使用Firebug我可以看到返回了相同的HTTP 302响应。

我仔细阅读了XMLHttpRequest的规范,并找到了这一部分:

  

如果重定向不违反安全性(例如,它是相同的原点),支持无限循环注意事项,并且支持该方案,则在观察同源请求事件规则时透明地遵循重定向。

     

否则,这是网络错误。

我甚至不知道客户端应该自动遵循他们为响应Ajax请求而获得的重定向;我关心的浏览器之前没有这样做过,因为我上面的代码曾经工作过。我最近升级了我的Firefox版本,现在可能更符合规范。规范规定的网络错误将解释我看到的零响应代码。但是,我得到的重定向是同一个主机(虽然在不同的端口),应该没有无限循环,并且该方案仍然是HTTP,所以我不明白为什么我收到网络错误

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你是如何实现这一功能的?如果你只是在200状态下将其发送到“错误”,显然这不起作用......

request.onreadystatechange = function( )
{
   if( this.readyState == 4 )
   {
      // if we got a 200
      if( this.status == 200 ){ /* cool */ }

      // if we got anything else
      else { error( this, this.status ); }
   }
};

但我假设你知道这一点。此外,您可能应该在window.location的末尾包含.href,并且可能是默认位置以防万一

// Display a "timed out" dialog, then:
window.location.href = request.getResponseHeader("Location") || defaultPage;

如果这不起作用,您可能希望在onreadystatechange方法中尝试不同的状态,因为某些浏览器可能会将非200状态解释为错误。这些可能是(根据您正在阅读的相同规范):

0 (if it's considered aborted after unset, though unlikely)
2 (headers-sent) as that 302 code is actually a HTTP header
祝你好运!