2016-09-14 25 views
1

CORSリクエストのサポートをJava Webアプリケーションに追加しています。何らかの不明な理由により、FirefoxがContent-Typeヘッダーを正しく送信または受信していません。アプリケーションはJetty Webサーバー上で動作しますが、すべてがChromeで正常に動作します。CORSプリフライトがFirefoxで動作しない、Chromeで動作する

問題がFirefox、Jetty、またはGoogleのフロントエンドアプリケーションにあるかどうかはわかりませんが、何か変わっています。 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の呼び出しです。私は桟橋とFirefoxの間に奇妙な相互作用を探してみた

$.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": "..." 
}) 

は、Mozillaのバグトラッカー(運)の周り掘って、両方のブラウザで無効にすべての拡張機能は、任意の奇妙なプラグインの問題を解消します。これまでに私が行ったことは何の違いもありません。私はここでウィットの終わりです。私は何が欠けていますか?

+0

[Jetty 8はEOL(End of Life)](https://dev.eclipse.org/mhonarc/lists/jetty-announce/msg00069.html)アップグレードを検討してください。 –

+0

残念ながら、これは現在オプションではありません。私はアップグレードすることができるようになるとは思っていますが、現在は既存の機能の範囲外です。 しかし、もしJetty 8がCORSサポートをバグしているのであれば、私たちはアップグレードに向けて私たちに力を与えるかもしれません。 – ChimericDream

+0

応答で 'access-control-allow-headers:authorization、-type'は文字通りサーバが実際に返すものですか? 'content-type'の代わりに' -type'だけありますか? – sideshowbarker

答えて

1

TL; DR

はApache CXFは、CORSのFilterクラスにバグがありました。バグは本当に古いバージョンにのみ存在します。 CXFをバージョン2.7.6以降にアップデートすると、問題が解決されます。


最近、私たちがそれに関連して顧客に関するいくつかの問題を抱えていたとき、このバグに戻ってきました。私は最終的にソースを追跡し、他の誰かが同じように実行する場合は、ここに投稿すると思った。しかし、修正の性質を考えると、ほとんどの人が安全になることを願っています。

原因は、Apache CXFライブラリのCrossOriginResourceSharingFilterクラスになっています。私たちが使っていたバージョン(old)は、ヘッダ解析にバグがありました。これは後のバージョンで修正されています。

具体的には、フィルタでは、,\s*と想定されていたヘッダー値の区切り文字として,\w*が使用されました。その結果、コンマで区切られたリストには、コンマに続く空白も含まれていないため、正しく解析されません。

このバグはずっと以前に修正されていたので、この回答が必要な人はほとんどいないことを願っています。しかし、サードパーティ製のライブラリを更新する場合(企業の場合のように)企業の動きが遅いことを知り、私はこれをそこに置くことを望んでいました。

+0

答えに照らして、質問タグに 'cxf'を追加することをお勧めします(これは現在のタグの1つを削除することを意味しますが、CXFが最も関連性が高いようです)。 – sideshowbarker

+0

@sideshowbarkerよろしくお願いします。元のタグを編集してCXF用のJettyを入れ替えました。 – ChimericDream

関連する問題