【问题标题】:Set-Cookie header in Glassfish-5: folding several cookies in one header not working on Firefox (https + HTTP/2.0)Glassfish-5 中的 Set-Cookie 标头:在一个标头中折叠多个 cookie 在 Firefox 上不起作用(https + HTTP/2.0)
【发布时间】:2018-01-20 11:20:22
【问题描述】:

我注意到 Glassfish-5 网络服务器发送的响应只有一个 Set-Cookie 标头,其中包含多个 cookie。当我查看萤火虫时,我可以看到它们被未知字符隔开。无论如何 - Firefox 只读取第一个 cookie。如何配置 Glassfish5 以发送多个 Set-Cookie 标头 - 每个 cookie 一个? rfc6265 声明:

  1. 概述
    ...
    源服务器不应将多个 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:

只收到一个 - 值不正确...:

Firefox 开发者版也一样:

完全糊涂了..

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.ne​​xt,但是……你还在 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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 啊,酷。所以我认为问题是here in EncoderUtils,讨厌的字符是一个空字符(\u0000),修复提交是here,(虽然评论引用了灰熊问题库中的另一个错误,但也许它实际上已修复几个)。
    【解决方案3】:

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

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

    Grizzly 从 2.4.0 开始支持 HTTP2,但您必须 explicitly enable it... 和 GlassFish does that by default

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

    虽然 Glassfish/Grizzly 团队致力于 fixing the (apparent) bug,但您可以在 GlassFish 中禁用 http2 作为解决方法。

    假设您的 HTTPS 侦听器是 http-listener-2,您可以从命令行执行此操作:

    asadmin set server.network-config.protocols.protocol.http-listener-2.htt‌​p.http2-enabled=fals‌​e
    

    据我所知,此设置尚未记录,我从this @Attribute in source code 推断出上面的命令(并在代码中一直跟踪到GenericGrizzlyListener)。此外,该属性似乎没有在管理控制台中公开,所以我认为除了使用上述asadmin set 之外别无他法(请注意“版本”属性是distinct 设置)。

    我的研究基于“最新升级的版本”(当时的 b19,“latest nightly”将是 b20)。指向 GitHub 的链接指向 b19。

    【讨论】:

    • 我可以确认asadmin set server.network-config.protocols.protocol.http-listener-2.htt‌​p.http2-enabled=fals‌​e 工作正常,所以这是一个临时解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2012-07-17
    • 2011-01-28
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多