预检响应中的Access-Control-Allow-Origin不支持跨域访问

时间:2014-09-02 19:08:44

标签: ajax node.js cors

我正在尝试使用AJAX向nodeJS服务器发送CORS请求。我想返回一些JSON数据。我在网上找到了很多教程都说同样的东西,我试过了,但是我无法让它发挥作用。这是AJAX请求:

$.ajax({
        url: "http://some.other.url.com:8880",
        type: "GET",
        crossDomain: true,
        contentType: 'application/json'
    }).then(function(response) {
        $scope.allData = jQuery.parseJSON( response );
        console.log($scope.allData);
    }).fail(function(response) {
});

这是服务器上的代码:

var path = url.parse(req.url).pathname,
    match = router.match(path),
    rescode;

    console.log("---: " + req.method);

if (req.method === 'OPTIONS') {
    var headers = {};
    headers["Access-Control-Allow-Origin"] = "*";
    headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
    headers["Access-Control-Allow-Credentials"] = false;
    headers["Access-Control-Max-Age"] = '86400'; // 24 hours
    headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept";
    res.writeHead(200, headers);
    return res.end();
}

我也尝试过没有返回res.end(),即没有返回OPTIONS预检请求,但这也不起作用。

- Edit-- 以下是控制台中的实际错误消息:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://other.domain.com:8880/. This can be fixed by moving the resource to the same domain or enabling CORS.

服务器正在获取请求。 OPTIONS和GET请求都会命中服务器并进行响应。实际上,在发出AJAX请求的页面的控制台日志中,我可以单击CORS错误并查看响应,这是正确的数据。但我似乎无法让javascript继续下去。

关于.done vs .then,它们似乎可以互换。或者至少,在此示例中,.then.fail工作得很好。

1 个答案:

答案 0 :(得分:2)

您在OPTIONS预检响应中正确设置了CORS标头,但您还需要在实际GET响应中设置Access-Control-Allow-Origin(对原点或*)。无论是否有预检响应,GET响应都应使用相同的CORS标头进行响应。这意味着它必须发送适当的CORS头,但除了Access-Control-Allow-Origin之外,它不需要发送任何内容。 (如果涉及其他非简单组件,如非简单动词或标题,它们将在预检中被允许或拒绝;实际的GET响应不需要担心它们。)

Enable CORS网站有一个CORS testing tool,可帮助您查看您指定的请求中涉及的标头。我已经使用该工具设置了test similar to your case(带有非简单Content-Type标头的GET)。如果我们检查一下这个测试的结果(小心 - 步骤有点乱,但它们都在那里),我们看到了一个预检响应:

Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS
...
Access-Control-Allow-Origin: http://client.cors-api.appspot.com
Access-Control-Allow-Headers: X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept

最后的CORS回复:

Content-Length: 0
Content-Type: application/json
Access-Control-Allow-Origin: http://client.cors-api.appspot.com
Cache-Control: no-cache

如您所见,GET响应还有一个Access-Control-Allow-Origin标头,没有其他CORS标头。如果您有任何进一步的不确定性,请随意调整该工具的设置以运行各种其他测试用例。