2011-08-16 70 views
1

如何使工作XHR跨域請求 - 我試過'腳本標記哈克',但它不工作,或者我做錯了什麼。有什麼建議麼?如何使跨域XHR請求

我想從B.

調用腳本在域A中

域A: [index.html的]

<head> 
<script type="text/javascript" src="https://evilDomain/xhrTest.js"></script> 
</head> 

域B: [xhrTest.js]

$.ajax({ 
     url: "https://evilDomain/processRequest", 
     success: function(result){ 
     alert(result); 
     } 
}); 

編輯

我也試着以這種方式使用JSONP:

$.ajax({ 
     url: "https://evilDomain/processRequest", 
     dataType: "jsonp", 
     success: function(result){ 
     alert(result); 
     } 
}); 

我使用Tomcat容器,是訪問控制允許來源頭連接解決方​​案?

回答

1

通常,你會要求你的服務器爲你做請求。

另一種選擇是讓其他人爲你做這件事(如雅虎的服務)。

您的問題是域B的代碼仍然在域A的上下文中執行。 因此,https://evilDomain/processRequest仍然無法讀取,因爲代碼正在執行爲域A即使它實際上來自域B

+0

是的,最清晰的(沒有黑客)解決方案是使用服務器,它請求我。感謝你的回答。 – smas

1

使用JSONP或在您自己的域上有一個服務調用服務器端的其他域,並獲得您需要的方式。

+0

我想過這個問題,但我創建登錄表單。當我使用JSONP時,我必須通過URL中的所有參數 – smas

+0

爲什麼在url中傳遞它們?做一個POST,而不是GET。 – nickytonline

+0

作爲維基百科說(http://en.wikipedia.org/wiki/JSONP)你需要使用腳本標記導入腳本,所以它是GET。你可以用POST提出你的版本嗎? – smas

1

域B JS正被包含在頁面中,然後從源自域A的頁面執行,因此出現問題。要做到這一點跨域,你需要將數據響應作爲一個「腳本」本身請求,然後從那裏解析它。

3

是的,您可以將訪問控制 - 允許來源標題添加到您的服務器響應中。這將允許您進行跨域請求。

訪問控制允許的方法需要然後,您可以進一步自定義訪問控制允許報頭

欲瞭解更多詳情,請參閱https://developer.mozilla.org/en/HTTP_access_control

+0

是的,但它不是我的好方案 - 它應該與大多數瀏覽器兼容(即使ie6) – smas

+1

然後JSONP是您唯一的選擇。 –

+0

但我也需要做登錄表單,所以我不能在URL中傳遞憑據 – smas