我正在尝试检测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且状态文本为“”):
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正在做正确的事情,但我不太明白为什么响应标头会因错误状态而被清除。