【发布时间】:2018-01-20 11:20:22
【问题描述】:
我注意到 Glassfish-5 网络服务器发送的响应只有一个 Set-Cookie 标头,其中包含多个 cookie。当我查看萤火虫时,我可以看到它们被未知字符隔开。无论如何 - Firefox 只读取第一个 cookie。如何配置 Glassfish5 以发送多个 Set-Cookie 标头 - 每个 cookie 一个? rfc6265 声明:
- 概述
...
源服务器不应将多个 Set-Cookie 标头字段折叠成单个标头字段。通常的机制 折叠 HTTP 标头字段(即,如 [RFC2616] 中定义的)可能 更改 Set-Cookie 标头字段的语义,因为 Set-Cookie 以一种冲突的方式使用 %x2C (",") 字符 有这样的折叠。
...
还有here声明:
发送带有多个 cookie 的 HTTP 响应时,CFHTTPMessage 将 cookie 组合成一个逗号分隔的列表 “Set-Cookie”HTTP 标头。 (这被称为 “设置cookie折叠”。)
Google Chrome、Firefox 和 IE浏览器。这些浏览器中的每一个都将完全忽略每一个 第一个逗号后的cookie,完全呈现CFHTTPMessage 无用处理具有多个 cookie 的 HTTP 响应 Safari 以外的浏览器(支持 cookie 折叠)。
这是响应在 firebug 上的样子:
两个饼干由未知字符连接。正如我所注意到的 - 其他服务器(如 Apache)通过换行符将多个 cookie 拆分为一个 Set-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 上通过启用/禁用 about:config 中的 network.http.spdy.enabled.http2 进行了测试。在 HTTP/1.1 上,通过 HTTPS cookie 按预期设置。
【问题讨论】:
-
你能告诉我字符代码吗?
-
Dang,我刚刚意识到您正在使用 Firebug... 使用 HTTP/2... 引用 getfirebug.com:Firebug 扩展不是不再开发或维护。我们邀请您改用 Firefox DevTools。好的,有 Firebug.next,但是……你还在 Firefox DevTools 的 Network 标签中看到这个奇怪的字符吗?您如何观察到只有第一个 cookie 有效?
-
是的,在 Firefox Developer Ed 上也是如此。我可以检查工具 -> 选项 -> 删除单个 cookie 收到的 cookie。
-
还注意到 NetBeans IDE 8.2 HTTP Server Monitor 显示请求协议 HTTP/2.0,所以这意味着它支持 HTTP/2.0 ?
标签: java http servlets cookies glassfish-5