2015-11-19 61 views
1

我讀到瀏覽器安全策略背後的主要想法是,您無法從域中獲取數據,這個域與頁面本身的服務域不同。但我不明白爲什麼我能做到這一點呢?瀏覽器安全策略如何與XMLHttpRequest協同工作?

<!doctype html> 
<html> 
    <head> 
     <title>Template</title> 
     <meta charset="utf-8"> 
     <link rel="stylesheet" href="style.css"> 
     <script src="jscript.js"></script> 
    </head> 
    <body> 
    </body> 
</html> 

window.onload = function() { 
    var request = new XMLHttpRequest(); 
    var url = "http://mbigras.github.io/geolocation/data.json"; 
    request.open("GET", url); 

    request.onload = function() { 
     if (request.status == 200) { 
      var object2 = JSON.parse(request.responseText); 
      alert(object2.name + ", age " + object2.age); 
     } 
    } 
    request.send(null); 
}; 

由於沒有從我的電腦服務在國內的頁面(我的本地機器上的index.html),而我使用XMLHttpRequest來從GitHub請求JSON數據?或者我在這裏誤解了什麼?

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS – epascarello

回答

2

這被稱爲交叉來源政策。內容的主機(在這種情況下,github)可以發送HTTP頭回到你的腳本,說「嘿,你可以做我的跨源請求!」。您的網頁瀏覽器(符合相同的原產地政策)將允許請求發生。

它實際上是您的瀏覽器(而不是github服務器),最終拋棄了跨源請求。即使您向不允許交叉源請求的位置發出AJAX請求,您的瀏覽器仍在執行請求(稱爲預檢請求)。

在實際請求被觸發之前,瀏覽器會向遠程服務器發出預檢請求,以檢查是否允許執行跨源請求。你的瀏覽器對遠程服務器說:「嘿,我允許向你提出請求,因爲你在另一個域中?」如果運行在另一端的Web服務器沒有回覆交叉源頭,那麼答案是否定的。

在你引用的github url的情況下,github的web服務器是用跨域標題回覆的,所以你的瀏覽器說「很好,謝謝!」並按照您的預期執行GET或POST請求。

,一個服務器可以發送到客戶端跨起源頭的一個例子是:

Access-Control-Allow-Origin: http://bob.com 
Access-Control-Allow-Methods: GET, POST, PUT 
Content-Type: text/html; charset=utf-8 

,並在這個例子中,服務器告訴客戶端「從bob.com請求是允許的,只要因爲它們是GET,POST或PUT請求「

+0

老兄,你這麼完全搖滾的人,謝謝。 – mbigras