跨域 AJAX JSON

6

我正在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之外,还有其他解决方法吗?

谢谢。


9
端口也必须匹配,否则jsonp确实是唯一的选择。 - Pekka
我遇到了同样的问题。在我看来,文档中应该澄清这一点(即端口被视为域的一部分)。此外,跨子域的请求是否也是非法的? - snapfractalpop
3个回答

7
如果您正在调用相同域名的内容,为什么在$.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/


你好,能否解释一下为什么这不安全? - FriiSource
Origin请求头指示跨域请求来自哪里。最不安全的做法是允许任何第三方网站访问您的数据(即设置"Access-Control-Allow-Orgin: *")。如果您的数据是公开的,那么这也许是您想要的,但您应该谨慎使用它。更安全的做法是读取Origin头并验证它是否是一个批准的域,然后只为批准的域发出"Access-Control-Allow-Orgin: http://site.com"头。 - monsur

0
你必须在与你所加载脚本相同的域名和端口上进行调用。你应该可以使用 jmort 的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接