缺少“Access-Control-Allow-Origin”标头的客户端解决方案

时间:2014-01-16 15:08:42

标签: javascript xmlhttprequest

我正在尝试创建XMLHttpRequest来检索位于远程服务器上的XML文档。我正在开发的应用程序最终将托管在请求需要访问的同一台服务器上,尽管目前我正在从另一个位置开发它。当我从Javascript发出请求时,收到错误声明:

XMLHttpRequest cannot load [url] No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 

此处已经发布了许多类似的问题(例如here),并且一般解决方案似乎是对服务器进行修改以添加额外的标头以允许外部访问。但是在我目前的情况下,修改服务器不是一个选项,所以我想知道是否有任何其他客户端解决方法我可以实现来完成此请求。如果可能的话,我希望能够在不使用jQuery的情况下找到解决方案。

以下是我用来发出请求的代码:

var request = new XMLHttpRequest();
request.open("GET", url, true);
request.onreadystatechange = function () {
    responseHandler(request);
};
request.send(null);

目前我想出了一个解决方法,使用PHP代理发出请求(所以我的Javascript调用转到本地托管的PHP脚本,然后从服务器检索XML文件),因为PHP似乎没有像Javascript一样强制执行此访问控制策略。在PHP中,我提出这样的请求:

header('Content-type: application/xml');
header("Access-Control-Allow-Origin: *");
echo file_get_contents($url);

我必须在PHP代理上添加标题,以便我可以在本地网络上运行的多个设备上测试应用程序。

我们非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

服务器端代理 - 就像您在问题中实现的那样 - 是唯一的解决方案。

请注意,代理请求不会使用用户的身份验证Cookie执行。例如,尝试使用代理获取mail.google.com将获取GMail登录页面,而不是用户的收件箱。此安全功能与同源策略存在的原因密切相关(即,它不允许源A上的页面使用来自源B的凭据从源B获取页面)。

您也可以让用户安装一个浏览器插件,该插件不受SOP的约束。这样的插件可以执行跨源请求(通常是带有凭据的),然后将结果传递给网页。这可能是一个糟糕的解决方案,因为它要求您的用户安装软件才能使用您的网站。