对于在Firefox中具有状态代码408的XHR,状态代码,文本和所有响应头都为空

时间:2013-11-26 06:44:44

标签: javascript jquery firefox xmlhttprequest http-status-codes

我正在尝试检测Ajax(xhr)请求何时获取状态代码408,以便将用户定向到登录/超时页面。

目前我正在使用旧版本的jQuery(1.3.2)来执行我的所有ajax请求,并使用以下代码来检测408错误响应:

$().ready(function() {
  $.ajaxSetup({
    error:function(x,e) {
      if (x.status==408) {
        document.location.href = '/timeout.html'; 
      } else {
        document.location.href = '/error.html'; 
      }   
    }
  });
});

此代码在Firefox中无法正常工作,并且xhr对象的状态代码为0且状态文本为空,即使状态代码确实为408.因此,将加载常规错误页面而不是超时页面。

编辑:我尝试了console.dir(x)并获得了此输出(因为您可以看到状态为0且状态文本为“”): enter image description here

ajax请求不是跨域的,而是来自同一个域。

我还注意到,对于在Firefox中具有错误状态的任何XHR,都会清除所有响应标头。

这些问题在Chrome中都不明显。

我甚至尝试过一个简单的XMLHttpRequest到一个URL,该URL将返回408状态(全部在同一个域/源上)并且所有头都为null - 示例如下所示:

var x = new XMLHttpRequest();
x.open("GET", "http://example.com/url-that-will-return-408-status");
x.onreadystatechange = function() {
  if(this.readyState == 2) {
    console.log('CustomErrorCode=' + this.getResponseHeader('CustomErrorCode'));
    console.log('Content-Length=' + this.getResponseHeader('Content-Length'));
    console.log('Content-Type=' + this.getResponseHeader('Content-Type'));
    console.log(this.getAllResponseHeaders());
  }
}
x.send();

关于为什么Firefox在这方面与Chrome不同以及如何解决此问题的任何想法?根据我的reading of the W3C spec,似乎Firefox正在做正确的事情,但我不太明白为什么响应标头会因错误状态而被清除。

1 个答案:

答案 0 :(得分:1)

检查this

Firefox的重新请求似乎是提供408状态代码的10倍。

已针对此Firefox“问题”打开ticket,此行为实际上与RFC不符。由于标记为正式标记为已解决修复(与其他408个相关的问题,herehere),我建议您检查一下您的版本并最终重新检查打开它,提供有关您的环境的更多信息。