CORS 预检在 Firefox 中失败,但在 Chrome for Apache CXF 中有效

Chi*_*eam 5 javascript firefox google-chrome cxf cors

我正在向 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
Run Code Online (Sandbox Code Playgroud)

回复

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
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

回复

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)
Run Code Online (Sandbox Code Playgroud)

发出请求的代码是一个普通的 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": "..."
})
Run Code Online (Sandbox Code Playgroud)

我试过在 Jetty 和 Firefox 之间寻找奇怪的交互,在 Mozilla 的错误跟踪器中挖掘(没有运气),并禁用了两个浏览器中的所有扩展以消除任何奇怪的插件问题。到目前为止,我所做的一切都没有什么不同。我在这里不知所措。我错过了什么?

Chi*_*eam 4

太长了;博士

Apache CXF 的 CORS Filter 类中存在错误。该错误仅存在于非常旧的版本中。将 CXF 更新到版本 2.7.6 或更高版本可以解决该问题。


最近,当我们遇到更多与之相关的客户问题时,我又回到了这个错误。我终于找到了来源,并认为我会将其发布在这里,以防其他人遇到同样的情况。不过,考虑到修复的性质,我希望大多数人都是安全的。

原因归结为CrossOriginResourceSharingFilterApache CXF 库中的类。我们使用的版本(版本)在标头解析中存在错误,该错误已在后续版本中修复。

具体来说,过滤器用作,\w*标头值的分隔符,我认为其目的是,\s*. 因此,逗号分隔的列表如果逗号后面没有空格,就会被错误地解析。

由于这个错误很久以前就被修复了,我希望很少有人需要这个答案。但我知道企业在更新第三方库时可能会进展缓慢(就像我们的例子一样),所以我想把它放在那里。