我试图检测 XMLHttpRequest() 何时由于跨域错误而不是错误请求而失败。例如:
ajaxObj=new XMLHttpRequest()
ajaxObj.open("GET", url, true);
ajaxObj.send(null);
考虑 url 的 4 种情况:
案例 1: url 是正确设置 access-control-allow-origin 的有效地址
- 示例:
http://192.168.8.35
我有一个Access-Control-Allow-Origin: *
在标题中设置的服务器 - 这很容易检测为 ajaxObj.readyState==4 和 ajaxObj.status==200
案例 2: url 是现有服务器上的无效地址
- 示例:
http://xyz.google.com
服务器响应但不是有效请求 - 这导致 ajaxObj.readyState==4 和 ajaxObj.status==0
案例 3: url 指向一个不存在的服务器 IP 地址
- 示例:
http://192.168.8.6
在我没有任何响应的本地网络上 - 这导致 ajaxObj.readyState==4 和 ajaxObj.status==0
案例 4: url 是一个有效的地址,其中没有设置access-control-allow-origin
- 示例:
http://192.168.8.247
我有一个没有Access-Control-Allow-Origin: *
在标题中设置的服务器 - 这导致 ajaxObj.readyState==4 和 ajaxObj.status==0
问题是:如何区分案例 4(访问控制允许来源错误)和案例 2&3?
在案例 4 中,Chrome 调试控制台显示错误:
XMLHttpRequest cannot load http://192.168.8.247/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
如何在 Javascript 中显示该错误?
我试图在其中找到一些迹象,ajaxObj
但与案例 2 和 3 相比似乎没有什么不同。
这是我使用的一个简单测试:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CORS Test</title>
<script type="text/javascript">
function PgBoot()
{
// doCORS("http://192.168.8.35"); // Case 1
// doCORS("http://xyz.google.com"); // Case 2
doCORS("http://192.168.8.6"); // Case 3
// doCORS("http://192.168.8.247"); // Case 4
}
function doCORS(url)
{
document.getElementById("statusDiv").innerHTML+="Processing url="+url+"<br>";
var ajaxObj=new XMLHttpRequest();
ajaxObj.overrideMimeType('text/xml');
ajaxObj.onreadystatechange = function()
{
var stat=document.getElementById("statusDiv");
stat.innerHTML+="readyState="+ajaxObj.readyState;
if(ajaxObj.readyState==4)
stat.innerHTML+=", status="+ajaxObj.status;
stat.innerHTML+="<br>";
}
ajaxObj.open("GET", url, true);
ajaxObj.send(null);
}
</script>
</head>
<body onload="PgBoot()">
<div id="statusDiv"></div>
</body>
</html>
使用 Chrome 的结果:
Processing url=http://192.168.8.35
readyState=1
readyState=2
readyState=3
readyState=4, status=200
Processing url=http://xyz.google.com
readyState=1
readyState=4, status=0
Processing url=http://192.168.8.6
readyState=1
readyState=4, status=0
Processing url=http://192.168.8.247
readyState=1
readyState=4, status=0