2011-12-11 42 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

相关问题