[英]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.