Glassfish-5中的Set-Cookie标头:在一个标头中折叠多个cookie而不在Firefox上运行(https + HTTP/2.0)

Ern*_*dis 13 java cookies servlets http glassfish-5

我注意到Glassfish-5 Web服务器仅使用一个Set-Cookie标头发送响应,其中包含多个cookie.当我用萤火虫看时,我可以看到它们被未知的角色分开.无论如何 - Firefox只读取第一个cookie.如何配置Glassfish5发送多个Set-Cookie标头 - 每个cookie一个?rfc6265指出:

  1. 概述
    ...
    源服务器不应该将多个Set-Cookie头字段折叠到单个头字段中.折叠HTTP头字段的常用机制(即,如[RFC2616]中所定义)可能会更改Set-Cookie头字段的语义,因为Set-Cookie以一种冲突的方式使用%x2C(",")字符有这样的折叠.
    ...

此外在这里它指出:

当发送带有多个cookie的HTTP响应时,CFHTTPMessage将cookie组合到单个"Set-Cookie"HTTP头下的逗号分隔列表中.(这被称为"set-cookie-folding".)

Google Chrome,Firefox和Internet Explorer不支持设置Cookie折叠.这些浏览器中的每一个都会在第一个逗号后完全忽略每个cookie,使得CFHTTPMessage完全无用于在除Safari之外的任何浏览器中处理具有多个cookie的HTTP响应(支持cookie折叠).

这就是响应在firebug上看起来的样子: 在此输入图像描述 两个饼干由未知字符联合.正如我所注意到的那样 - 像Apache这样的其他服务器Set-Cookie通过新行字符在一个标题中分割多个cookie .

我注意到这只发生在HTTPS连接上.

另外,我在Github上开设了一个问题在这里.

尝试在Tomcat 9 Web服务器上运行相同的Web应用程序 - Set-Cookie标题cookie由新行字符分隔,它的工作方式与预期相符... 在此输入图像描述

相同的响应,但在Glassfish5上,再次 - cookie由未知字符加入,并且不被Firefox接受(只是第一个): 在此输入图像描述

在NetBeans IDE 8.2 HTTP Server Monitor中我可以看到,发送了2个cookie - 看起来没问题: 在此输入图像描述

再次使用FireFox - 一个Set-Cookie标头中的2个Cookie: 在此输入图像描述

只收到一个 - 而且值不正确......: 在此输入图像描述

Firefox Developer Edition上也是如此:
在此输入图像描述

完全糊涂..

Glassfish 5使用Grizzly Framework 2.4.0 - 我认为可以在grizzly-http-servlet-2.4.0-sources.jar中找到源代码 - 但找不到将cookie连接在一起的代码段.

我现在可以确认它只与HTTP/2.0协议有关,通过启用/禁用network.http.spdy.enabled.http2在Firefox上测试about:config.在HTTP/1.1上通过HTTPS cookie按预期设置.

rlu*_*bke 1

您不再需要那个自定义的nucleus-grizzly-all.jar。该问题已作为最新 Glassfish 5.0 nightlies 和最新升级版本的一部分发布。

当我跟踪 Grizzly 问题的实际修复并使用 GlassFish 问题集成 Grizzly 时,出现了两个不同的问题。