我正在向Java Web应用程序添加对CORS请求的支持,由于某些未知原因,Firefox未正确发送(或接收)Content-Type
标头。该应用程序在Jetty Web服务器上运行,但一切都在Chrome中正常运行。
我不确定问题出在Firefox,Jetty或我们的前端应用程序上,但某些东西很奇怪。
根据Firefox的请求和响应标头:
请求
Host: localhost:8889
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: POST
Access-Control-Request-Headers: authorization,content-type
Origin: http://localhost:7778
DNT: 1
Connection: keep-alive
响应
Access-Control-Allow-Origin: http://localhost:7778
Content-Length: 0
Date: Wed, 14 Sep 2016 17:10:36 GMT, Wed, 14 Sep 2016 17:10:36 GMT
Server: Jetty(8.1.14.v20131031)
access-control-allow-credentials: true
access-control-allow-headers: authorization, -type
access-control-allow-methods: POST
Chrome中提出的同样要求:
请求
OPTIONS *redacted* HTTP/1.1
Host: localhost:8889
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:7778
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
Access-Control-Request-Headers: authorization, content-type
Accept: */*
DNT: 1
Referer: http://localhost:7778/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
响应
HTTP/1.1 200 OK
Date: Wed, 14 Sep 2016 16:14:34 GMT
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization, content-type
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: http://localhost:7778
Content-Length: 0
Date: Wed, 14 Sep 2016 16:14:34 GMT
Server: Jetty(8.1.14.v20131031)
发出请求的代码是一个普通的jQuery调用;
$.ajax({
"url": "http://localhost:8889/...",
"method": "POST",
"accepts": "*/*",
"headers": {
"Authorization": "Basic ..." // yes, I know. it's a legacy app
},
"xhrFields": {
"withCredentials": true
},
"contentType": "application/json",
"data": "..."
})
我尝试在Jetty和Firefox之间寻找奇怪的互动,在Mozilla的bug追踪器中挖掘(没有运气),并禁用两种浏览器中的所有扩展以消除任何奇怪的插件问题。到目前为止,我所做的一切都没有什么作用。我在这里结束了。我错过了什么?
答案 0 :(得分:2)
<强> TL;博士强>
Apache CXF在其CORS Filter类中有一个错误。该错误仅出现在真正的旧版本中。将CXF更新到2.7.6或更高版本可以解决此问题。
最近,当我们遇到一些与此相关的客户问题时,我又回到了这个bug。我终于找到了源码,并认为我会在这里发布,以防其他人遇到同样的情况。考虑到修复的性质,我希望大多数人都是安全的。
原因归结为Apache CXF库中的CrossOriginResourceSharingFilter
类。我们所使用的版本(一个旧的一个)在其头部解析中有一个错误,该错误已在以后的版本中修补。
具体来说,过滤器使用,\w*
作为标头值的分隔符,我认为它是,\s*
。因此,以逗号分隔的列表也不会在逗号后面有空格进行解析。
由于这个bug早就修复了,我希望很少有人需要这个答案。但是,在更新第三方库时,我知道公司可以缓慢行动(如我们的情况),我想把它放在那里。
答案 1 :(得分:0)
对我来说,问题是在本地主机上的同一端口上运行两个服务器。我不知道一台服务器正在运行,但它是发送错误的CORS响应的服务器。我不知道为什么它似乎始终可以在Chrome上运行。