我注意到 Glassfish-5 网络服务器发送的响应只有一个Set-Cookie
标头,其中包含多个 cookie。当我查看萤火虫时,我可以看到它们被未知字符隔开。无论如何 - Firefox 只读取第一个 cookie。如何配置 Glassfish5 以发送多个 Set-Cookie 标头 - 每个 cookie 一个?RFC6265指出:
- 概述
...
源服务器不应将多个 Set-Cookie 标头字段折叠成单个标头字段。折叠 HTTP 标头字段的常用机制(即,如 [RFC2616] 中定义的)可能会更改 Set-Cookie 标头字段的语义,因为 Set-Cookie 以一种冲突的方式使用 %x2C (",") 字符有了这样的折叠。
...
这里也有说明:
当发送带有多个 cookie 的 HTTP 响应时,CFHTTPMessage 将 cookie 组合成一个逗号分隔的列表,位于单个“Set-Cookie”HTTP 标头下。(这被称为“set-cookie-folding”。)
Google Chrome、Firefox 和 Internet Explorer 不支持 Set-cookie-folding。这些浏览器中的每一个都将完全忽略第一个逗号之后的每个 cookie,从而使 CFHTTPMessage 在除 Safari(支持 cookie 折叠)之外的任何浏览器中处理具有多个 cookie 的 HTTP 响应时完全无用。
这就是 firebug 上的响应:
两个 cookie 由未知字符连接。Set-Cookie
正如我所注意到的 - 像 Apache 这样的其他服务器通过换行符将多个 cookie 拆分为一个标题。
我注意到这只发生在 HTTPS 连接上。
另外,我在 Github here上打开了一个问题。
尝试在 Tomcat 9 Web 服务器上运行相同的 Web 应用程序 -Set-Cookie
标头 cookie 由换行符分隔,它按预期工作......
相同的响应,但在 Glassfish5 上,再次 - cookie 由未知字符连接,并且不被 Firefox 接受(只是第一个):
在 NetBeans IDE 8.2 HTTP Server Monitor 中,我可以看到发送了 2 个 cookie - 看起来没问题:
再次在 FireFox 上 - 一个 Set-Cookie 标头中有 2 个 cookie:
完全糊涂了。。
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 按预期设置。