Wildfly 允许 OPTIONS 方法但返回 405 Method not allowed

Posted

技术标签:

【中文标题】Wildfly 允许 OPTIONS 方法但返回 405 Method not allowed【英文标题】:Wildfly allow OPTIONS Methods but return 405 Method not allowed 【发布时间】:2017-07-05 10:03:06 【问题描述】:

我正在尝试使用XmlHttpRequest 对象在javascript 中使用POST 方法发送xml。 在我的服务器上,我有一个接收 SOAP 请求的网络服务。

当我想发送 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

有什么建议吗?

【问题讨论】:

【参考方案1】:

问题是我的响应标头中有 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();

【讨论】:

确实,你是对的。由于我无法访问 Web 服务代码,我将使用不使用 xmlhttprequest 的中间件服务开发另一个解决方案 :) 感谢您的回答

以上是关于Wildfly 允许 OPTIONS 方法但返回 405 Method not allowed的主要内容,如果未能解决你的问题,请参考以下文章

Angular:HTTP GET 请求 - OPTIONS 405(不允许的方法)

HTTP的options方法作用

Wildfly 上的 JMS 2.0 QueueBrowser 不返回消息

带有预检的 POST 请求包含允许的来源,但错误是不允许来源

为啥 Wildfly 10 在部署时给我“jdbc:postgresql 不允许空名称段”?

如何验证apache 允许OPTIONS方法