2016-02-19 27 views
0

我使用靜態html/javascript頁面(無php等)使用XMLHttpRequest和表單調用URL有什麼區別?

我有一個靜態的HTML網頁。當頁面加載時,它會向另一個域上的目標服務器發送XMLHttpRequest,等待響應並解析響應JSON。

function executeRequest() { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (xhttp.readyState == 4 && xhttp.status == 200) { 
     var response = JSON.decode(xhttp.responseText); 
     alert(response.access_token) 
     alert(response.expires_in) 
     } 
    }; 
    var tmpURL = "https://target.url.com/oauth2/access_token" 
    xhttp.open("POST", tmpURL, true); 
    xhttp.send(); 
    } 

的XMLHttpRequest不能加載[target.url.com]否「訪問控制允許來源」 頭存在於所請求的資源。 原產地'https://local.url.com'因此不允許訪問。

爲了排除CORS的問題,我可以請求帶有表單的URL。當用戶點擊提交按鈕時,它會帶來成功的迴應。

<form method="POST" action="https://target.url.com/oauth2/access_token"> 
    ... form inputs here 
    <input type="submit" value="Submit form"> 
</form> 

爲什麼目標服務器對xmlHttpRequest的響應方式與Form不同?

+0

*「來排除問題CORS,我可以用形式請求URL。」 *這並不排除或CORS,CORS不適用於跨域的形式發佈。基本上允許交叉數據發送數據,但是讀取數據的交叉來源是CORS進入的地方。你的問題是CORS。 –

+0

你有CORS問題,如果你得到一個'不「訪問控制允許來源」標頭present'錯誤...看看,你得到那些 –

回答

1

您有CORS問題。

XMLHttpRequests受到CORS規則。與HTML做純粹

<form method="POST" action="http://xxx">職位不受CORS規則。

就這麼簡單。這種跨起源形式後允許其原因

部分是,瀏覽器將改變瀏覽器窗口中顯示從表單提交的響應,因此跨源站點控制接下來會發生什麼。 XMLHttpRequest的情況並非如此,其中請求頁面控制接下來發生的事情,因爲在XMLHttpRequest之後沒有自動加載或顯示頁面。所以,XMLHttpRequest比使用表單發佈更容易造成惡作劇。

Cross Domain Form POSTing一些進一步的解釋。

+0

的一個來自目標的響應是簡單的JSON數據(不一個用戶友好的網頁),不會重定向回我的域名。如果我不能在頁面中「包裝」這個請求/響應,我該如何使用它提供的數據(回想我僅限於靜態頁面沒有PHP等)? – torpedo51

+0

@ torpedo51 - 很顯然,您需要使用Javascript將JSON用於可在瀏覽器中顯示的內容。因此,您需要使用'XMLHttpRequest',因此如果您想直接轉到一個交叉原點域,則需要該域來允許您使用COR來完成此操作。如果你不能這樣做,那麼你可能必須從你自己的域名代理它,或者是網頁的同一個域名,所以沒有CORs問題,或者你可以從你自己的域名中啓用CORs。 – jfriend00

相關問題