2011-11-30 91 views
2

我試圖請求位於另一個域/服務器上的數據,但當我嘗試發送請求時收到異常。請求在另一個域/服務器上的內容

var request = new XMLHttpRequest(); 
request.open("GET", "http://www.w3schools.com/ajax/cd_catalog.xml", false); 
request.send(); 

錯誤:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)" nsresult: "0x80004005 (NS_ERROR_FAILURE)"]

這是正確的方式來請求內容是不一樣的域/服務器上?或者有其他方法可以實現這一目標嗎?

我在firefox 8.0中測試了這個,但我想要一個適用於所有主流現代瀏覽器的解決方案。

回答

2

您無法直接從其他域檢索內容。您可以通過爲您執行作業的服務器(代理)或使用類似JSONP的內容檢索內容。檢查這個wikipedia page

有關主題的額外信息,this page可能是有趣

1

其跨域請求時,它總是使用服務器上的代理進行。您創建一個服務器請求,並使用JavaScript

var request = new XMLHttpRequest(); 
request.open("GET", "abc.aspx"); 
request.send(); 
2

這就是所謂的跨域Ajax大多數瀏覽器認爲這是一個安全違規調用http://www.w3schools.com/ajax/cd_catalog.xml像abc.apsx該網頁上,並呼籲自己的abc.aspx。一種解決方法是創建一個服務器端組件(與您正在查看的頁面相同的域),它將請求來自其他服務器(您的案例中的/www.w3schools.com)的數據並將其回顯給您的Ajax請求。

這些鏈接會解釋這個問題和幾個解決方案:

http://jimbojw.com/wiki/index.php?title=Introduction_to_Cross-Domain_Ajaxrequest

http://usejquery.com/posts/the-jquery-cross-domain-ajax-guide

3

出於安全原因,這樣的請求將無法正常工作。想象一下,如果任何域名可以訪問任何其他域名的數據 - 您最終會得到任何網站(例如www.sketchyattacksite.com)能夠從任何其他網站(例如www.bankofamerica.com)提取任意內容,包括經過身份驗證的用戶保密會話信息。由所有現代瀏覽器實施的same origin policy存在以防止發生這種安全侵害。

有幾個常見的方式,以繞過同源策略:

  1. 你請求的數據從可以返回上述數據爲JSONP(加載它,它可以讓就好像它是一個外部域腳本,不受同一起源策略的限制)。通常,網站會在其API中提供JSONP格式,例如:https://graph.facebook.com/cocacola?callback=name_of_function_to_pass_data_via_jsonp
  2. Cross-Origin Resource Sharing (CORS)是最新的標準,因此只能在較新的瀏覽器中使用,但允許網站指定(通過HTTP標頭)允許哪些域訪問它們的域數據。例如,如果美國銀行出於某種原因希望允許www.sketchyattacksite.com向www.bankofamerica.com發出請求,他們可能會返回Access-Control-Allow-Origin: sketchyattacksite.com標題。
  3. 一個服務器端代理。您可以在您的服務器上創建一個處理程序,其唯一功能是檢索您的目標文件http://www.w3schools.com/ajax/cd_catalog.xml並將其返回到您的域。請注意,這樣可以解決可能傳遞機密數據的問題,因爲您的服務器(無法訪問w3schools.com上的用戶cookie)不是由用戶的瀏覽器發出請求來執行的。

在這種特殊情況下,它看起來像服務器端代理#3就是答案。爲什麼?因爲您無法控制網站的數據(這意味着您無法利用#1或#2的優勢,除非w3schools.com自己選擇實施它們)。這是simple PHP example of a serverside proxy,由雅虎提供!關鍵在於它被鎖定只能從特定的域中獲取內容(這樣,不良的角色就不能將它用於代表您的任意請求),除此之外,它就像通過請求目標URL一樣簡單捲曲並將其返回給用戶。請注意,您可能還需要添加緩存,以防止您的服務器端代理的每次加載都會觸發http://www.w3schools.com/ajax/cd_catalog.xml文件的新請求。

相關問題