2014-07-08 80 views
-1

下面是JavaScript代碼的片段時:的Javascript報告CORS錯誤加載google.com

  var requ = "http://google.com"; 
      var xmlhttp; 

      xmlhttp = new XMLHttpRequest(); 

      xmlhttp.onreadystatechange = function() 
      { 
       // BREAKPOINT A 
       if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
       { 
        // never gets into this block 
       } 

      }; 
      xmlhttp.open("GET", requ, true); 
      xmlhttp.send(); 

代碼執行通過斷點正好2倍。

第一次:xmlhttp.readyState == 1; xmlhttp.status == 0;

第二次:xmlhttp.readyState == 4; xmlhttp.status == 0;

鉻控制檯報告:

XMLHttpRequest cannot load http://google.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:50261' is therefore not allowed access. 

問題是什麼?爲什麼我無法獲得成功的迴應?

編輯#1

所以,問題是,google.com不支持CORS。但是,也許我可以向另一個方向擴展這個問題。

我正在使用Fiddlerhttp://google.com上發送GET。 請求中沒有Origin頭文件。實際上,根本沒有指定標題。 請求已成功完成。我怎樣才能測試一個網站是否支持CORS而無需編寫JS代碼並執行它?我如何使用Fiddler來測試同樣的事情?

編輯#2

我發現了一個site迅速回答我的問題。 我仍然想知道爲什麼它不通過提琴手。

+2

讀入同源策略 - 你不能做XHR時不同的域。在stackoverflow上有關於這個主題的很多問題。 – Christoph

+0

Fiddler是本地代理;您可以使用Composer發送您想要的任何請求;它不受同源策略的限制,因爲它不是一個Web應用程序。它會發送你告訴它的任何標題;如果你想發送一個Origin頭文件,添加一個。 – EricLaw

回答

4

readyState指示您的請求的狀態。 readyState基本上等於「建立連接」並且readyState「請求結束」。

您的請求從1跳到4,因爲您收到Same Origin Policy錯誤。如果您正在做出正確的請求,則會包含狀態2和3(2:收到標題,3:收到響應主體)。

您的跨越源請求獲取到readyState 4,但實際上從未保存200狀態。

欲瞭解更多信息:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

+0

我知道同源策略。我錯誤地認爲http://google.com是爲所有起源啓用CORS的。 將刪除這個問題... – ancajic

+0

我測試了與我自己的另一個URL相同的JS代碼,我確定它啓用了來自任何Origin的請求。它的工作原理應該如此,所以這個問題是無效的。 – ancajic