我正在研究一個必須支持IE10的角度web應用程序。我需要對我們的企業salesforce服務器進行跨域調用。在chrome中(我們不支持正式的,但我們都在開發)調用失敗,因爲chrome會讓OPTIONS預檢呼叫到不支持CORS的salesforce服務器。Angular.js xhr.open()拋出「訪問被拒絕」錯誤
但是,IE並沒有做出CORS預檢,所以我認爲我打這個電話沒有任何問題。但是我得到了「訪問被拒絕」。從角碼內部深處拋出的錯誤。
進一步深挖發現,在角(v1.2.21)發生故障的具體線路是:
xhr.open(method, url, true); (on line 8544 if you happen to have version 1.2.21).
在看着github,google groups和stack overflow線程,我看到的問題可能與方式IE想要處理跨域請求,特別是哪個xhr對象被調用來進行調用。
看來,老版本的角度有這個問題,但它是通過將前xhr.open()
調用來檢索對IE的版本的正確XMLHttpRequest
對象的函數運行解決:
var xhr = createXhr(method);
xhr.open(method, url, true);
forEach(headers, function(value, key) {
if (isDefined(value)) {
xhr.setRequestHeader(key, value);
}
});
所以理論上,正確的xhr對象正在調用.open()
方法。但是對於我來說,該行會引發「訪問被拒絕」錯誤。
在上面的鏈接,似乎通常建議,而不是使用XMLHttpRequest
對象進行跨域調用,您必須使用XDomainRequest()
。我以爲這是不可能的角度鄉親錯過了這個,我想也無妨,只是手動改變在angular.js文件中的代碼返回該對象爲我們的具體銷售人員電話:
var xhr;
if (url.indexOf("salesforce.com") > -1) {
xhr = new XDomainRequest();
}
else {
xhr = createXhr(method);
}
xhr.open(method, url, true);
forEach(headers, function(value, key) {
if (isDefined(value)) {
xhr.setRequestHeader(key, value);
}
});
除了現在所在行的代碼嘗試呼叫xhr.setRequestHeader(key, value)
失敗。有誰知道問題是什麼?我很難相信角度無法處理IE中的跨域調用,所以我想我只是錯過了一些東西。
是你混合http和https? – epascarello 2014-11-05 18:32:48
@epascarello是的。我們的地址是'http:// ...',salesforce地址是'https:// ...'但是,如果我將他們的地址更改爲'http',我仍然會遇到同樣的問題。訪問被拒絕,實際上沒有對salesforce進行調用。 – tengen 2014-11-05 19:22:34
而那會是你的問題。 http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx – epascarello 2014-11-05 19:50:57