设置CORS不起作用

时间:2012-07-04 13:54:11

标签: javascript cors

我在服务器上设置了以下标题

response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
response.addHeader("Access-Control-Allow-Headers","X-Custom-Header");

我想使用POST方法访问Web服务并向其发送数据,但问题是我设置服务器导致问题

我使用了以下方法

function createCORSRequest(method, url) {
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr) {
        // XHR for Chrome/Safari/Firefox.
        xhr.open(method, url, true);
    }
    else if (typeof XDomainRequest != "undefined") {
        // XDomainRequest for IE.
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        // CORS not supported.
        xhr = null;
    }
    return xhr;
}

并基于此对象

url = "http://myurl.do";
var xhr = createCORSRequest('POST', url);
if (!xhr) {
    alert('CORS not supported');
    return;
}
var params = "name=pari123&action=initaction&gameId=slotreel3";
xhr.setRequestHeader('Content-Type', 'application/text/plain'); 
if(xhr.readyState == 4 && xhr.status == 200) 
{
    alert('Tested OK')
    xhr.send(params);
}
else
{
    alert('status not 200 or xhr is not ready');
}

// Response handlers.
xhr.onload = function() {
    var text = xhr.responseText;
    alert('Response from CORS request to ' + url + ': ' + text);
};

xhr.onerror = function() {
    alert('Woops, there was an error making the request.');
};

但是它总是警告一条消息,说'状态不是200或xhr还没准备好',如果你知道请帮助,我无法继续任何一个!

当我打印xhr.readyState时,打印的值为1

3 个答案:

答案 0 :(得分:2)

if(xhr.readyState == 4 && xhr.status == 200) 

此检查必须放在onreadystatechange事件处理程序中。在实际发送之前,你显然不能拥有200状态代码或“已完成”的请求。

你想要的可能就是:

xhr.onreadystatechange = function() {
    if(xhr.readyState == 4 && xhr.status == 200) {
        alert('Tested OK');
        var text = xhr.responseText;
        alert('Response from CORS request to ' + url + ': ' + text);
    }
};
xhr.send(params);

如果您希望else案例检查错误,请记住您仍然需要检查xhr.readyState == 4。您不希望您的错误处理代码为其他readyStates运行。

不需要onload事件 - 当您readyState == 4知道请求已完成时。

答案 1 :(得分:2)

这里可能有几个问题。

我发现不同的浏览器以不同的方式实现CORS。我的经验基于Firefox和谷歌浏览器。例如,我必须在服务器端添加一个特殊的标题,以便Firefox可以使用一个连接进行预检(OPTIONS)请求和实际请求(GET,PUT等),就像谷歌Chrome一样。您必须在服务器端添加:

response.addHeader("Keep-Alive", "timeout=2, max=100");
response.addHeader("Connection", "Keep-Alive");

我还注意到有些浏览器不喜欢CORS标头中的通配符(“*”)。该行的解决方法

response.addHeader("Access-Control-Allow-Origin", "*");

将返回请求的来源而不是通配符。

然而,可能还有其他问题,我们需要更多细节。例如,当服务器托管在同一域上时,请求是否有效(即问题可能与CORS无关)。你在用什么服务器?

答案 2 :(得分:0)

xhr.send();需要在调用xhr.open();之后才这样做吗?状态1表示请求尚未发送,除非您实际发送请求,否则它永远不会进入状态4。