【问题标题】:Cross domain ajax json跨域ajax json
【发布时间】:2011-02-14 00:30:12
【问题描述】:

我在 site.com 上试图从我在端口 8080 上服务的 node.js 服务器获取一些 json 数据。

我收到此错误消息:

XMLHttpRequest cannot load http://site.com:8080/json/1. Origin http://site.com is not allowed by Access-Control-Allow-Origin.

我的代码:

    $.get('http://site.com:8080/1/', {}, function (Data) {
       console.log(Data);
    }, "json");

但它是同一个域! :(

同时考虑我的backbone.js 模型:

model = Backbone.Model.extend({
    url: function() {
        return 'http://site.com:8080/' + this.id
    }
});

除了使用jsonp还有什么办法解决吗?

谢谢。

【问题讨论】:

  • 端口也必须匹配,否则jsonp确实是唯一的选择。
  • 我遇到了同样的问题。恕我直言,这应该在文档中澄清(端口被认为是域的一部分)。另外,跨子域的请求也是非法的吗?

标签: javascript jquery ajax cross-domain backbone.js


【解决方案1】:

如果您正在调用同一个域,为什么您的$.get 请求中有绝对路径?

试试这个:

$.get('/1/', {}, function (Data) {
   console.log(Data);
}, "json");


model = Backbone.Model.extend({
    url: function() {
        return '/' + this.id
    }
});

如果你真的在同一个域上进行调用,那么上面的代码应该可以工作。

【讨论】:

    【解决方案2】:

    或者,您可以修改 node.js 服务器以允许跨域资源共享 (CORS)。这仅适用于现代浏览器。最简单(也是最不安全)的做法是让您的 node.js 服务器发出标头“Access-Control-Allow-Origin:http://site.com”。您可以在此处了解有关 CORS 的更多信息:http://www.w3.org/TR/cors/

    【讨论】:

    • 您好,您能解释一下为什么这不安全吗?
    • Origin请求头表示跨域请求来自哪里。最不安全的做法是允许任何第三方站点访问您的数据(即设置“Access-Control-Allow-Orgin: *”)。如果您的数据是公开的,这可能是您想要的,但您应该谨慎使用它。更安全的做法是读取 Origin 标头并验证它是否是已批准的域,然后只为已批准的域发出“Access-Control-Allow-Orgin:site.com”标头。
    【解决方案3】:

    您必须调用加载脚本的同一域和端口。您应该能够使用 jmort 的代码。

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2013-06-03
      • 2012-03-02
      • 2012-04-22
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多