Ermitteln von CORS-Fehlern (Cross Origin) im Vergleich zu anderen Fehlertypen für XMLHttpRequest () in Javascript
Ich versuche zu erkennen, wann ein XMLHttpRequest () aufgrund eines Cross Origin-Fehlers im Gegensatz zu einer schlechten Anfrage fehlschlägt. Zum Beispiel:
ajaxObj=new XMLHttpRequest()
ajaxObj.open("GET", url, true);
ajaxObj.send(null);
Betrachten Sie 4 Fälle für die URL:
Fall 1: url ist eine gültige Adresse, an der der Ursprung der Zugriffssteuerung richtig festgelegt ist
Beispiel:http://192.168.8.35
wo ich einen server mit habeAccess-Control-Allow-Origin: *
in der Kopfzeile gesetztDies ist leicht als ajaxObj.readyState == 4 und ajaxObj.status == 200 zu erkennenFall 2: url ist eine ungültige Adresse auf einem vorhandenen Server
Beispiel:http://xyz.google.com
wo der Server antwortet, aber es ist keine gültige AnfrageDies führt zu ajaxObj.readyState == 4 und ajaxObj.status == 0Fall 3: Die URL bezieht sich auf eine nicht vorhandene Server-IP-Adresse
Beispiel:http://192.168.8.6
in meinem lokalen Netzwerk, in dem es nichts zu antworten gibtDies führt zu ajaxObj.readyState == 4 und ajaxObj.status == 0Fall 4: url ist eine gültige Adresse, an der der Ursprung der Zugriffssteuerung liegtNICHT einstellen
Beispiel:http://192.168.8.247
wo ich einen server habeohne Access-Control-Allow-Origin: *
in der Kopfzeile gesetztDies führt zu ajaxObj.readyState == 4 und ajaxObj.status == 0Das Problem ist:Wie unterscheide ich Fall 4 (Fehler bei der Zugriffssteuerung und beim Zulassen des Ursprungs) und Fall 2 und 3?
In Fall 4 zeigt die Chrome-Debug-Konsole den Fehler an:
XMLHttpRequest cannot load http://192.168.8.247/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
Wie mache ich diesen Fehler in Javascript bekannt?
Ich habe versucht, einen Hinweis in zu findenajaxObj
aber nichts scheint sich von Fall 2 & 3 zu unterscheiden.
Hier ist ein einfacher Test, den ich verwendet habe:
<!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>
Ergebnisse mit 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