JavaScript - XMLHttpRequest,Access-Control-Allow-Origin错误

时间:2014-02-08 01:09:13

标签: javascript xmlhttprequest

我正在尝试将XMLHttpRequest发送到粘贴网站。我正在发送一个包含api所需的所有字段的对象,但我一直在遇到这个问题。我已经阅读了这个问题,我想:

httpReq.setRequestHeader('Access-Control-Allow-Headers', '*');

会解决它,但事实并非如此。有没有人有关于此错误的信息和/或我如何解决它?

这是我的代码:

(function () {

    'use strict';

    var httpReq = new XMLHttpRequest();
    var url = 'http://paste.ee/api';
    var fields = 'key=public&description=test&paste=this is a test paste&format=JSON';
    var fields2 = {key: 'public', description: 'test', paste: 'this is a test paste', format: 'JSON'};

    httpReq.open('POST', url, true);
    console.log('good');

    httpReq.setRequestHeader('Access-Control-Allow-Headers', '*');
    httpReq.setRequestHeader('Content-type', 'application/ecmascript');
    httpReq.setRequestHeader('Access-Control-Allow-Origin', '*');
    console.log('ok');

    httpReq.onreadystatechange = function () {
        console.log('test');
        if (httpReq.readyState === 4 && httpReq.status === 'success') {
            console.log('test');
            alert(httpReq.responseText);
        }
    };

    httpReq.send(fields2);

}());

这是确切的控制台输出:

good
ok
Failed to load resource: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:40217' is therefore not allowed access. http://paste.ee/api
XMLHttpRequest cannot load http://paste.ee/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:40217' is therefore not allowed access. index.html:1
test

以下是我在常规Chromium浏览器上本地测试时的控制台输出:

good
ok
XMLHttpRequest cannot load http://paste.ee/api. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. index.html:1
test

2 个答案:

答案 0 :(得分:37)

我认为你错过了访问控制的重点。

快速回顾一下CORS存在的原因: 由于来自网站的JS代码可以执行XHR,该网站可能会向其他网站发送请求,伪装成您并利用这些网站中的信任(例如,如果您登录后,恶意站点可能会尝试提取信息或执行您从未想过的操作) - 这称为CSRF攻击。为了防止这种情况,Web浏览器对您可以发送的XHR有非常严格的限制 - 您通常仅限于您的域名,等等。

现在,有时网站允许其他网站与之联系是有用的 - 提供API或服务的网站(例如您尝试访问的网站)将成为主要候选网站。开发CORS是为了允许站点A(例如paste.ee)说“我信任站点B,所以你可以将XHR从它发送给我”。这是由站点A在其响应中发送“Access-Control-Allow-Origin”标头指定的。

在您的具体情况下,似乎paste.ee无需使用CORS。您最好的办法是联系网站所有者,如果您想将paste.ee与浏览器脚本一起使用,请找出原因。或者,您可以尝试使用扩展名(那些应具有更高的XHR权限)。

答案 1 :(得分:0)

我遇到了同样的问题。 服务器日志显示:

DEBUG: <-- origin: null

我已经对此进行了调查,当我从本地驱动器调用文件时,发生了这种情况。当我将文件复制到服务器并从服务器上使用它时 - 请求完全正常