Заголовок Set-Cookie в Glassfish-5: складывание нескольких файлов cookie в одном заголовке, не работающем в Firefox (https + HTTP/2.0)
Я заметил, что веб-сервер Glassfish-5 отправляет ответы только с одним заголовком Set-Cookie
, который содержит несколько файлов cookie. Когда я смотрю с помощью Firebug, я вижу, что они разделены неизвестным персонажем. В любом случае - Firefox читает только первый файл cookie. Как настроить Glassfish5 для отправки нескольких заголовков Set-Cookie - по одному для каждого файла cookie? rfc6265 утверждает, что:
- Обзор
Серверы происхождения НЕ ДОЛЖНЫ сбрасывать несколько полей заголовка 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 устанавливаются как ожидалось.
Ответы
Ответ 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.http.http2-enabled=false
Насколько я знаю, этот параметр еще не задокументирован, я вывел вышеприведенную команду из этот @Attribute в исходный код (и затем это через код до GenericGrizzlyListener
). Кроме того, кажется, что атрибут не отображается в консоли администратора, поэтому я не вижу другого способа, кроме использования asadmin set
, как указано выше (обратите внимание, что атрибут "Версия" отличный).
Я основывал свое исследование на "новейшей рекламируемой сборке" (b19 в то время "последняя ночная" - b20). Ссылки на GitHub указывают на b19.
Ответ 3
Теперь проблема решена командой профессионалов из стекла - мы должны изменить файл nucleus-grizzly-all.jar
с новым - доступным здесь в GitHub, Еще раз - большое спасибо команде разработчиков из морской рыбы!