我在CORS上遇到了另一个问题。我为ajax做了一个设置来处理一些错误,但问题是现在有些问题从未被跨域请求触发。
我知道不可能捕获预检(超时),因为它们是由浏览器触发的,是吗?但我认为应该可以通过.e.g捕获内部服务器错误。 GET之后。错误处理在没有CORS的情况下工作(结果500转换为0)
我从未调用的设置:
jQuery.ajaxSetup({
statusCode: {
500: function (data, textStatus, jqxhr) {
if (data.status === 500) {
window.location.hash = "#error";
}
}
}
});
GET请求:
jQuery.ajax({
url: url,
type:'GET',
timeout:1000
}).done (function (data, textStatus, jqXHR) {
updateCookie (jqXHR);
Logger.log("finished loading " + log);
callback(data);
}).fail (function (data, textStatus, jqXHR) {
Logger.log("failure loading " + log);
});
有人提示我如何解决这个问题吗? 问候
更新: Ok再次调试,发现失败被调用但是0f 500 - >返回状态0。
预检成功后的GET请求:
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
X-CSRF-TOKEN: 11258a06-36ea-4a21-a935-d215fcc92714
X-Requested-With: undefined
Origin: null
Connection: keep-alive
在尝试获取已删除的资源时,服务器的响应按预期进行:
Connection: close
Content-Language: en
Content-Type: text/html;charset=utf-8
Date: Mon, 08 Feb 2016 20:33:12 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
statusCode: 500
而不是这500是在ajax设置状态0调用。
答案 0 :(得分:1)
CORS规范在Cross-Origin Request with Preflight部分下列出:
在制作预检请求时,应遵守以下请求规则:
...
如果响应的HTTP状态代码不在2xx范围内
- 应用网络错误步骤。
如果出现网络错误
- 如果出现DNS错误,TLS协商失败或其他类型的网络错误,请应用网络错误步骤。请勿要求任何类型的最终用户互动。
因此,满足500响应或遇到超时(或任何其他网络故障)的预检会触发规范的网络错误步骤。" network error steps与一般CORS失败时使用的错误步骤相同(例如,允许错误的来源,根本不存在CORS头等):
每当应用网络错误步骤时,请终止调用此一组步骤的算法,并将跨源请求状态设置为网络错误。
在浏览器环境中," 网络错误"状态对应于状态0
。
为了防止这种情况发生,服务器必须确保预检不会失败。或者,更改您的请求以使其简单(即,仅使用简单的方法和标题),因此不需要预检。