Подтвердить что ты не робот

Заголовок Set-Cookie в Glassfish-5: складывание нескольких файлов cookie в одном заголовке, не работающем в Firefox (https + HTTP/2.0)

Я заметил, что веб-сервер Glassfish-5 отправляет ответы только с одним заголовком Set-Cookie, который содержит несколько файлов cookie. Когда я смотрю с помощью Firebug, я вижу, что они разделены неизвестным персонажем. В любом случае - Firefox читает только первый файл cookie. Как настроить Glassfish5 для отправки нескольких заголовков Set-Cookie - по одному для каждого файла cookie? rfc6265 утверждает, что:

  1. Обзор


    Серверы происхождения НЕ ДОЛЖНЫ сбрасывать несколько полей заголовка Set-Cookie в одно поле заголовка. Обычный механизм для складывающиеся заголовки HTTP-заголовков (то есть, как определено в [RFC2616]), могут измените семантику поля заголовка Set-Cookie, потому что Символ% x2C ( "," ) используется Set-Cookie способом, который конфликтует с такой складкой.

Также здесь сказано:

При отправке HTTP-ответа с несколькими файлами cookie, CFHTTPMessage объединяет файлы cookie в список, разделенный запятыми, под одним HTTP-заголовок "Set-Cookie". (Это называется "Set-Cookie складным".)

Set-cookie-folding НЕ поддерживается в Google Chrome, Firefox и Internet Explorer. Каждый из этих браузеров полностью игнорирует каждый cookie после первой запятой, полностью отдавая CFHTTPMessage бесполезно для обработки HTTP-ответов с несколькими куки файлами в любом браузер, отличный от Safari (который поддерживает слияние файлов cookie).

Вот как выглядит ответ на firebug: введите описание изображения здесь Два куки файла соединены неизвестным персонажем. Как я заметил, другие серверы, такие как Apache, разбивают несколько файлов cookie на один заголовок Set-Cookie на новый символ строки.

Я заметил, что это происходит только при соединениях HTTPS.

Кроме того, я открыл проблему в Github здесь.

Пробовал одно и то же веб-приложение для работы на веб-сервере Tomcat 9 - куки заголовка Set-Cookie разделены новым символом строки, он работает как ожидаемый... введите описание изображения здесь

Тот же ответ, но на Glassfish5, и снова - файлы cookie соединяются неизвестным персонажем и не принимаются Firefox (только первый): введите описание изображения здесь

В NetBeans IDE 8.2. Монитор HTTP-сервера. Я вижу, что отправлено 2 файла cookie - он выглядит нормально: введите описание изображения здесь

Еще раз на FireFox - 2 файла cookie в одном заголовке Set-Cookie: введите описание изображения здесь

Получено только одно - и неправильное значение...: введите описание изображения здесь

То же самое в Firefox Developer Edition:
введите описание изображения здесь

Полностью запутано..

Glassfish 5 использует Grizzly Framework 2.4.0 - я думаю, что источники доступны в grizzly-http-servlet-2.4.0-sources.jar - но не могут найти фрагмент кода, в котором файлы cookie объединены в одну строку.

Теперь я могу подтвердить, что он связан только с протоколом HTTP/2.0, протестированным в firefox, включив/отключив network.http.spdy.enabled.http2 в about:config. По HTTP/1.1 через HTTPS файлы cookie устанавливаются как ожидалось.

4b9b3361

Ответ 1

Вам больше не нужно это обычное ядро ​​- grizzly-all.jar. Эта проблема была выпущена в рамках самых последних новинок Glassfish 5.0 и самой последней рекламной сборки.

Были две разные проблемы, поскольку я отслеживал фактическое исправление с проблемой Grizzly и использовал проблему GlassFish для интеграции Grizzly.

Ответ 2

В серии комментариев, которые мы удалили с тех пор, я указал, что странные ответы были все http2 и дали указания отключить его на стороне сервера, как обход. Теперь, чтобы освободить место для других конструктивных комментариев (или ответов), мы удалили старые, и я перефразировал их как отдельный ответ ниже.

Кажется, фильтры Grizzly http2 плохо себя ведут (предположим, что на мгновение). Скриншоты Firefox показывают HTTP/2.0. Монитор сервера NetBeans работает нормально, потому что он не поддерживает http2, поэтому в этом случае ваш сервер возвращается к HTTP/1.1. (Edit: это было всего лишь предположение и более свежие комментарии, которые могут содержать http2...)

Grizzly поддерживает HTTP2 с 2.4.0, но вы должны явно включить его... и GlassFish делает это по умолчанию.

Как настроить Glassfish5 для отправки нескольких заголовков Set-Cookie - по одному для каждого файла cookie?

В то время как команда Glassfish/Grizzly работает над исправлением (очевидной) ошибки, вы можете отключить http2 в GlassFish как обход.

Предполагая, что ваш слушатель HTTPS http-listener-2, вы можете сделать это из командной строки:

asadmin set server.network-config.protocols.protocol.http-listener-2.htt‌​p.http2-enabled=fals‌​e

Насколько я знаю, этот параметр еще не задокументирован, я вывел вышеприведенную команду из этот @Attribute в исходный код (и затем это через код до GenericGrizzlyListener). Кроме того, кажется, что атрибут не отображается в консоли администратора, поэтому я не вижу другого способа, кроме использования asadmin set, как указано выше (обратите внимание, что атрибут "Версия" отличный).

Я основывал свое исследование на "новейшей рекламируемой сборке" (b19 в то время "последняя ночная" - b20). Ссылки на GitHub указывают на b19.

Ответ 3

Теперь проблема решена командой профессионалов из стекла - мы должны изменить файл nucleus-grizzly-all.jar с новым - доступным здесь в GitHub, Еще раз - большое спасибо команде разработчиков из морской рыбы!