尝试访问本地主机时如何避免跨源策略错误?

发布于 2024-12-20 11:05:01 字数 602 浏览 1 评论 0原文

我想要在外部服务器上上传一个静态网站,该网站将尝试从 localhost:3000 获取 JSON 数据(服务器程序已经在用户的计算机上运行)。

我正在尝试使用 jQuery 来做到这一点,如下所示:

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

为什么我会收到跨域策略错误以及如何阻止它们?我认为访问 JSON 数据应该可以消除那些跨站点错误?

更新 1

我刚刚按照建议尝试了带有回调的 JSONP,但这里有一个奇怪的问题:如果我添加一个指向 localhost:3000/page URL 的脚本标记,当页面加载完成时,回调被加载并且数据被正确显示,但这不是我的目标。

如果我使用 $.getJSON 方法尝试相同的操作,我仍然会收到与以前相同的错误:

XMLHttpRequest 无法加载 http://localhost:3000/page。 Access-Control-Allow-Origin 不允许来源 http://localhost。。

I want to have a static website uploaded on an external server that will try to get JSON data from localhost:3000 (a server program will already be running on the user's computer).

I'm trying to do this with jQuery like this:

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

Why am I getting cross-origin policy errors and how can I stop them? I thought accessing JSON data was supposed to negate those cross-site errors?

UPDATE 1

I have just tried the JSONP with callback as suggested but here's a weird issue: If I add a script tag that points to the localhost:3000/page URL, the callback is loaded and the data is displayed properly when the page is done loading, but this is not what I am aiming for.

If I try the same thing using the $.getJSON method, I still get the same error as before:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

假面具 2024-12-27 11:05:01

有趣的想法!

localhostsomewebsite.com 是完全不同的域。因此适用同源政策。您需要:

  • JSONP 这意味着 localhost 上的服务器需要支持将 JSON 包装在自定义回调
  • CORS 中,这允许真正的跨域 ajax,但有很多额外的功能标头模糊测试是请求的两端都需要。

JSONP 可能是最容易实现的。来自 $.getJSON() 的文档:

如果 URL 包含字符串“callback=?” (或类似的,如定义
服务器端 API),请求将被视为 JSONP。请参阅
有关详细信息,请参阅 $.ajax() 中 jsonp 数据类型的讨论。

然后,您的 localhost 服务器只需要使用 jQuery 将传入的回调参数。这意味着

<%= jsonString() %>

本地服务器应该呈现更像这样的内容,而不是简单地呈现:

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

Interesting idea!

But localhost is a totally different domain from somewebsite.com. So the same origin policy applies. You need either:

  • JSONP Which means the server on localhost needs to support wrapping the JSON in a custom callback
  • CORS Which allows true cross domain ajax, but lots of extra header fuzting is required on both ends of the request.

JSONP is probably the easiest to pull off. From the docs for $.getJSON():

If the URL includes the string "callback=?" (or similar, as defined by
the server-side API), the request is treated as JSONP instead. See the
discussion of the jsonp data type in $.ajax() for more details.

Your localhost server then simply needs to use that callback parameter that jQuery will pass in. Meaning that instead of simply rendering this:

<%= jsonString() %>

The local server should render something more like this:

<% if (params.callback) { %>
  <%= params.callback %>(<%= jsonString %>);
<% } else { %>
  <%= jsonString %>
<% } %>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文