12

我注意到 Glassfish-5 网络服务器发送的响应只有一个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 不支持 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: 在此处输入图像描述

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

Firefox 开发者版也是如此:
在此处输入图像描述

完全糊涂了。。

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 按预期设置。

4

3 回答 3

3

在我们删除的一系列评论中,我指出奇怪的响应都是 http2,并指示在服务器端禁用它,作为一种解决方法。现在为其他建设性意见(或答案)腾出空间,我们删除了旧的意见,我在下面将它们作为单独的答案重新散列。

看起来 Grizzly 的 http2 过滤器行为不端(我们暂时假设一下)。您的 Firefox 屏幕截图正在显示HTTP/2.0。NetBeans 服务器监视器可能工作正常,因为它不支持 http2,因此您的服务器会退回到HTTP/1.1这种情况。(编辑:这只是一个假设,最近的评论暗示它可能支持 http2...)

Grizzly 自 2.4.0 起就支持 HTTP2,但您必须明确启用它……而 GlassFish默认情况下会这样做。

如何配置 Glassfish5 以发送多个 Set-Cookie 标头 - 每个 cookie 一个?

虽然 Glassfish/Grizzly 团队致力于修复(明显的)错误,但您可以在 GlassFish 中禁用 http2 作为解决方法。

假设您的 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。

于 2017-08-14T18:29:50.227 回答
1

现在,专业 glassfish 团队解决了这个问题——我们应该nucleus-grizzly-all.jar用新的文件更改文件文件——GitHub 上可用。再次感谢 glassfish 开发团队!

于 2017-08-17T00:25:07.427 回答
1

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

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

于 2017-08-22T14:58:36.037 回答