2016-09-14 2 views
1

Я добавляю поддержку запросов CORS к веб-приложению Java, и по какой-то неизвестной причине Firefox неправильно отправляет (или принимает) заголовок Content-Type. Приложение работает на веб-сервере Jetty, но все работает правильно в Chrome.CORE preflight не работает в Firefox, работает в 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 

Response

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 

Response

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 (не повез), и инвалиды всех расширений в обеих браузерах, чтобы устранить любые странные проблемы плагина. Ничего, что я сделал до сих пор, не имеет значения. Я здесь нахожусь здесь. Что мне не хватает?

+0

[Jetty 8 - EOL (конец жизни)] (https://dev.eclipse.org/mhonarc/lists/jetty-announce/msg00069.html) рассматривает возможность обновления. –

+0

К сожалению, это не вариант. Я бы мог обновить, хотя в настоящее время он недоступен для существующих функций. Однако, если проблема в том, что Jetty 8 имеет багги-поддержку CORS, это может дать мне некоторое преимущество, чтобы подтолкнуть нас к обновлению. – ChimericDream

+0

Является ли 'control-allow-head-allow-headers: authorization, -type' в ответе буквально, что сервер фактически возвращает? Просто '-type' вместо' content-type' там? – sideshowbarker

ответ

1

Т.Л., д-р

Apache CXF была ошибка в CORS фильтра класса. Ошибка присутствует только в действительно старых версиях. Обновление CXF до версии 2.7.6 или новее разрешает проблему.


Я вернулся к этой ошибке недавно, когда у нас было еще несколько проблем с клиентами, связанных с ней. Я, наконец, выследил источник и подумал, что отправлю его здесь, если кто-то еще столкнется с этим. Однако, учитывая характер исправления, я надеюсь, что большинство людей будут в безопасности.

Причина сводится к классу CrossOriginResourceSharingFilter в библиотеке Apache CXF. Версия, на которой мы были (, старый), имела ошибку в анализе заголовков, которая была исправлена ​​в более поздних версиях.

В частности, фильтр использовал ,\w* в качестве разделителя для значений заголовка, который, как я полагаю, должен был быть ,\s*. В результате списки с разделителями-запятыми, которые также не имеют пробелов после запятой, обрабатываются неправильно.

Поскольку ошибка была исправлена ​​так давно, я надеюсь, что мало кто нуждается в этом ответе. Но, зная, что корпорации могут медленно двигаться, когда речь заходит об обновлении сторонних библиотек (как в нашем случае), я хотел бы поместить это там.

+0

В ответ на это вы можете подумать о добавлении 'cxf' в теги вопроса (что означало бы сброс одного из текущих тегов, но похоже, что CXF является наиболее актуальным). – sideshowbarker

+0

@sideshowbarker хороший звонок. Я отредактировал исходные теги для замены Jetty для CXF. – ChimericDream