我尝试使用POST
对象在javascript中使用XmlHttpRequest
方法发送xml。
在我的服务器上,我是一个接收SOAP请求的Web服务。
当我想发送xml时,浏览器通常会尝试向服务器发送预检OPTIONS
请求,但它会返回OPTIONS 405 Method Not Allowed
。
问题是我在我的回复标题中Access-Control-Method-Allowed : POST,OPTIONS,GET,PUT
所以我想我的服务器接受OPTIONS方法,但我的网络服务只能理解POST
请求。
这里有一些代码:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', url, false);
var sr = mySoapRequest; //Here's my XML
xmlhttp.onreadystatechange = () => {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
var xml = xmlhttp.responseXML;
console.log(xml);
this.showAlert(xml);
}
}
}
xmlhttp.setRequestHeader("content-type", "file/xml");
xmlhttp.send(sr);
这是我的HTTP协议请求标头:
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:fr-FR,fr;q=0.8,en;q=0.6,en-US;q=0.4
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
DNT:1
Host:192.168.149.127
Origin:http://192.168.149.1:8100
Referer:http://192.168.149.1:8100/?ionicplatform=android
这是我的HTTP协议响应标头:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, authorization, content-type, x-requested-with
Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT
Access-Control-Allow-Origin:*
Access-Control-Max-Age:1
Connection:keep-alive
Content-Length:224
Content-Type:text/xml;charset=UTF-8
Date:Thu, 16 Feb 2017 10:25:33 GMT
Server:WildFly/8
X-Content-Type-Options:nosniff
X-FRAME-OPTIONS:SAMEORIGIN
X-Powered-By:Undertow/1
X-XSS-Protection:1
有什么建议吗?
答案 0 :(得分:3)
问题是我的响应标题中的Access-Control-Method-Allowed:POST,OPTIONS,GET,PUT所以我想我的服务器接受OPTIONS方法
没有
这只是意味着当您回复任何要求放入该标题的请求时,您告诉浏览器可以接受跨域OPTIONS请求。
这绝对不会让您的服务器使用200 OK
代替405 Method Not Allowed
来回复OPTIONS请求。
This answer建议:
@OPTIONS
@Path("{path : .*}")
public Response options() {
return Response.ok("")
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.build();
}