2013-03-14 163 views
3

我用下面的腳本 -訪問控制允許來源錯誤

<!DOCTYPE html> 
<html> 
<head> 
<script src="jquery-1.9.1.min.js"></script> 
<script> 
function postForm() { 

    $.ajax({ 
      type: 'POST', 
      url: 'http://10.0.0.8:9000/demo', 
      data: {"name" : "test"}, 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
     }) 
    } 

</script> 
</head> 
<body> 
    <form id="ajaxForm" onsubmit="postForm(); return false; " method="post"> 
     <input id="test" type="text" name="name" value="Hello JSON" /> 
     <input type="submit" value="Submit JSON" /> 
    </form> 

</body> 
</html> 

我試圖訪問該計算機正在運行的遊戲框架。我收到以下錯誤:

OPTIONS http://10.0.0.8:9000/demo 404(未找到)的jquery-1.9.1.min.js:5 的XMLHttpRequest不能加載http://10.0.0.8:9000/demo。 Access-Control-Allow-Origin不允許產生http://localhost:8080

我已經被困了兩天,任何人都可以幫我嗎?

感謝提前

+1

注意:'contentType'是'**內容類型'標頭***發送給**請求**中的服務器!這不是***迴應的「內容類型」。這裏不正確。 – 2013-03-14 14:50:14

+0

這是另一種解決方案; http://stackoverflow.com/questions/7564832/how-to-bypass-access-control-allow-origin/17098221#17098221 – 2014-02-26 21:07:58

回答

19

的問題是,你想使一個跨域調用(從http://localhost:8080http://localhost:9000)。這是Same Origin Policy所不允許的,所以瀏覽器試圖使用Cross-Origin Resource Sharing詢問服務器是否允許跨源呼叫。 (這是您看到的OPTIONS HTTP請求。)由於服務器不回覆OPTIONS請求,並且頭部允許進行呼叫,出於安全原因,它會被瀏覽器拒絕。

SOP適用於所有真正的「ajax」調用(例如,通過XMLHttpRequest)。您可以:

  1. 更新實施到OPTIONS請求回傳的標題,可讓呼叫(這將使它在most modern browsers工作)的響應服務器,或

  2. 使請求相同的端口(我猜你有沒有這樣做的原因),所以請求是相同的來源和SOP不適用,或

  3. 切換到使用JSON-P。但JSON-P不適用於表單提交,因爲它是GET,並且GET的操作應該是idempotent,而大多數表單提交不是。因此,除非這是一個冪等的表單提交(例如,搜索),否則使用JSON-P就會成爲黑客。

+1

謝謝你的快速答案TJ,我會投票,如果我有足夠的代表... – Gidon 2013-03-14 15:29:15

+0

如果您使用apache作爲本地主機,您是否有關於如何「更新服務器以實現對OPTIONS的響應」的鏈接? – 2014-10-26 14:52:31

相關問題