不正なリクエストではなく、クロス オリジン エラーが原因で 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 (access-control-allow-origin エラー) とケース 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