繁体   English   中英

设置CORS不起作用

[英]Setting up CORS not working

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

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

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 您不希望为其他readyState运行错误处理代码。

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

这里可能有几个问题。

我观察到不同的浏览器对CORS的实现方式有所不同。 我的经验是基于Firefox和Google Chrome。 例如,我必须在服务器端添加一个特殊的标头,以便Firefox可以像Google Chrome那样使用一个连接发出预检(OPTIONS)请求和实际请求(GET,PUT等)。 您将必须在服务器端添加:

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

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

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

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

但是,还可能存在其他问题,我们需要更多详细信息。 例如,当服务器托管在同一域上时,请求是否起作用(即问题可能与CORS无关)。 您正在使用什么服务器?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM