2011-01-23 96 views
2

我試圖通過發送Access-Control-Allow-Origin:*標題已經允許外部請求的外部域的ajax調用,但我在xmlhttp.post()行獲得權限被拒絕。IE瀏覽器拒絕AJAX權限?

這裏是我的代碼:

var xmlhttp; 
try { 
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
} catch (e) { 
    try { 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } catch (E) { 
     xmlhttp = false; 
    } 
} 

if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { 
    try { 
     xmlhttp = new XMLHttpRequest(); 
    } catch (e) { 
     xmlhttp = false; 
    } 
} 

xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     alert(xmlhttp.responseText); 
    } 
} 

xmlhttp.open("GET", "http://www.domain.com", true); 
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
xmlhttp.send(); 
+0

什麼版本的IE? – ceejayoz 2011-01-23 02:50:02

+0

我在IE 8上測試過它 – Ryan 2011-01-23 02:50:40

回答

1

我相信在IE中,你仍然不能使用XMLHttpRequest來進行跨域請求。爲此,您需要使用XDomainRequest對象。完整的文檔是here。我相信引入單獨對象的原因是爲了讓開發人員在發出請求時進行兼容性測試,而這種請求肯定會在較舊的瀏覽器中失敗。

0

我相信你只能使用Ajax和URL的形式相同的網域調用頁面。這不是外部域不允許請求,這是您的瀏覽器的安全。看看Same Origin Policy 這是一種避免跨瀏覽器腳本的方法 - 否則想象你有一個頁面,你可以輸入你的信用卡信息,並且有人注入一個腳本,用來發送你輸入到外部網站的信息。將是一個大問題打。

+0

問題頂部的標題'Access-Control-Allow-Origin:*'應該允許瀏覽器跨域訪問內容(在可識別它的瀏覽器中)。 IE8應該,但我不認爲IE7。 FireFox在版本3.5的基礎上增加了支持,因此覆蓋範圍還遠遠沒有完成。 – Andrew 2011-01-23 03:25:21

0

注意:不要在「Ajax」中使用「http://domain.xxx」或「http://localhost/」或「IP」作爲URL。 只使用路徑(目錄)和沒有地址的頁面名稱。

假狀態:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST', 'http://www.example.com/dir1/dir2/page.php', true); 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 

真實狀態:

var AJAXobj = createAjax(); 
AJAXobj.onreadystatechange = handlesAJAXcheck; 
AJAXobj.open('POST','dir1/dir2/page.php', true); // <<--- note 
AJAXobj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
AJAXobj.send(pack); 

function createAjax() 
{ 
    var ajaxHttp = null; 
    try 
    { 
     if(typeof ActiveXObject == 'function') 
      ajaxHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     else 
     if(window.XMLHttpRequest) 
      ajaxHttp = new XMLHttpRequest(); 
    } 
    catch(e) 
    { 
     alert(e.message); 
     return null; 
    } 
    //------------- 
    return ajaxHttp; 
};