AJAX起源null不被access-control-allow-origin允许。

3

我正在使用BASEX(一种XML数据库),并尝试连接到HTTP服务器以执行使用Ajax的REST请求。我的代码在IE中运行良好,但在Firefox或Chrome中无法正常工作。我尝试了两种Ajax查询方式。

以下是第一种方式:

var jqxhr = $.get( "http://localhost:8984/rest/factbook?query=//city&wrap=yes", function(data)

这段代码在IE上可以正常工作,但在其他浏览器上不能正常工作。经过一些研究,我发现存在一个源的问题:

“origin null is not allowed by access-control-allow-origin”

第二个问题是:

$.ajax({
    type: "GET",
    url: "http://localhost:8984/rest/factbook?query=//city&wrap=yes",
    contentType: "xml/application",
    dataType: "xml",

这段代码在IE上可以运行,但在其他浏览器上出现了404错误。

我尝试将我的脚本放在wamp服务器上,但是我得到了同样的错误:

源http:/ localhost不被访问控制允许来源所允许

我还尝试用计算机的IP地址替换本地主机,但仍然出现了同样的错误。

有人能帮我吗?


3
由于同源策略(Same Origin Policy),http://localhost和http://localhost:8984被视为不同的域名。 - epascarello
服务器提供您的文件必须返回一个名为 Access-Control-Allow-Origin 的标头,其值为 *,以允许所有域或特定域名。 - Ahmad
2个回答

2
我猜您无法使其工作的原因是需要一些服务器端编码。
尝试添加 Access-Control-Allow-Origin 标头到HTTP响应中,并将值设置为*。这里有一段Java代码供您参考。 response.setHeader("Access-Control-Allow-Origin", "*")

1
正如你所发现的,如果页面是从磁盘(null origin)提供服务的话,一些浏览器不允许进行CORS请求。这是因为它被认为是一种安全风险,因为包括/home/myself/mycode.html/tmp/84d8da9/dangerous_trojan.html在内的磁盘上所有文件都共享同一个域名:磁盘。如果IE允许这样做,则应该被视为漏洞。事实上,null origin(磁盘)甚至不允许常规的非CORS xmlHTTPrequest。

一些浏览器甚至进一步禁止本地域名(例如localhost127.0.0.1::1)进行CORS请求。因此,仅仅从服务器上提供页面是不够的。

解决方法是给你的页面一个域名。对于开发目的,你不必购买域名。只需修改浏览器所在机器的hosts文件即可。


我可能误解了你的问题。如果你不是在尝试进行CORS请求,那么错误只是由于同源策略造成的(CORS旨在解决这个问题)。因此,解决方案就是确保网页和ajax源都从同一个域名服务。常规非CORS ajax适用于本地域,因此请确保你的网页和ajax源都来自于http://localhost/http://localhost:8984/。如果你想让localhost能够向localhost:8984发出ajax请求,你需要在localhost:8984服务器上实现CORS。

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