2011-12-11 51 views
4

我想有上傳,將嘗試從localhost:3000獲取JSON數據(服務器程序就已經在用戶的計算機上運行)外部服務器上的靜態網站。嘗試訪問本地主機時,如何避免跨源策略錯誤?

我試圖用jQuery做到這一點是這樣的:

$.getJSON("http://localhost:3000/page", function(data){ 
    // process data... 
}); 

爲什麼我會收到跨域政策錯誤,我怎麼能阻止他們?我認爲訪問JSON數據應該會消除這些跨站點錯誤?

更新1

我剛纔想了JSONP有回調的建議,但這裏有一個奇怪的問題:如果我添加指向localhost:3000/page URL的腳本標籤,回調被加載並顯示的數據正確的時候頁面完成加載,但這不是我的目標。

如果我嘗試使用$.getJSON方法同樣的事情,我仍然得到同樣的錯誤之前:

XMLHttpRequest cannot load http://localhost:3000/page. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

+0

您可能想要['JSONP'](http://api.jquery.com/jQuery.getJSON/#jsonp)。 –

+0

看看這個http://en.wikipedia.org/wiki/Same_origin_policy – Monty

回答

3

有趣的想法!

localhostsomewebsite.com一個完全不同的領域。因此適用相同的原產地政策。您需要用:

  • JSONP這意味着在localhost需要的服務器,以支持自定義的回調
  • CORS這使得真正的跨域AJAX包裝的JSON,但有很多額外的頭fuzting的需要在兩端請求。

JSONP可能是最容易拉斷。從文檔$.getJSON()

如果URL包含字符串「callback =?」 (或類似的,如通過 服務器端API定義),請求被視爲JSONP代替。有關更多詳細信息,請參閱$ .ajax()中有關jsonp數據類型的 討論。

localhost服務器,則僅需要使用回調參數jQuery將在傳遞意思就是說而不是簡單地呈現這樣的:

<%= jsonString() %> 

本地服務器應該更喜歡這種呈現的東西:

<% if (params.callback) { %> 
    <%= params.callback %>(<%= jsonString %>); 
<% } else { %> 
    <%= jsonString %> 
<% } %> 
+0

謝謝您的回答!我剛剛嘗試過,但仍然遇到麻煩。請看我更新的問題。 – user1092719

+0

如果您收到該消息,那麼jQuery不使用JSONP。用'dataType:「jsonp」'而不是'$ .getJSON()'試試'$ .ajax()'方法。在做任何棘手的事情時,通常建議使用'.ajax()'方法的靈活性。 –

+0

啊哈!現在數據的加載沒問題,現在我只想弄清楚如何儘可能地調整回調。再次感謝,非常有幫助! :) – user1092719

相關問題