Java 在Glassfish-5中设置Cookie头:在一个头中折叠多个Cookie在Firefox上不起作用(https+;HTTP/2.0)

Java 在Glassfish-5中设置Cookie头:在一个头中折叠多个Cookie在Firefox上不起作用(https+;HTTP/2.0),java,http,servlets,cookies,glassfish-5,Java,Http,Servlets,Cookies,Glassfish 5,我注意到Glassfish-5Web服务器只发送一个Set Cookie头的响应,其中包含几个Cookie。当我用萤火虫观察时,我可以看到它们被未知字符分隔开。无论如何,Firefox只读取第一个cookie。如何配置Glassfish5发送多个集Cookie头-每个Cookie一个?声明: 概述源服务器不应将多个集合Cookie标头字段折叠为单个标头字段。通常的机制 折叠HTTP头字段(如[RFC2616]中的定义)可能会 更改Set Cookie标头字段的语义,因为 %设置Cookie使用x

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

  • 概述

    源服务器不应将多个集合Cookie标头字段折叠为单个标头字段。通常的机制 折叠HTTP头字段(如[RFC2616]中的定义)可能会 更改Set Cookie标头字段的语义,因为 %设置Cookie使用x2C(“,”)字符的方式存在冲突 有这样的折叠。
  • 还规定:

    当发送带有多个cookie的HTTP响应时,CFHTTPMessage 将Cookie合并到一个以逗号分隔的列表中 “设置Cookie”HTTP头。(这称为 “设置曲奇折叠”。)

    Google Chrome、Firefox和Google浏览器不支持设置cookie折叠 Internet Explorer。这些浏览器中的每一个都会完全忽略每一个 第一个逗号后的cookie,完全呈现CFHTTPMessage 在任何情况下都无法处理具有多个cookie的HTTP响应 Safari以外的浏览器(支持cookie折叠)

    以下是firebug上的响应: 两个cookie由未知字符连接。正如我所注意到的,其他服务器(如Apache)将多个Cookie拆分为一个
    Set Cookie
    header中的新行字符

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

    另外,我在Github上打开了一个问题

    尝试在Tomcat 9 web服务器上运行相同的web应用程序-
    设置Cookie
    标题Cookie由新行字符分隔,工作正常。。。

    同样的响应,但在Glassfish5上,再次-Cookie由未知字符连接,Firefox不接受(仅第一个):

    在NetBeans IDE 8.2 HTTP服务器监视器中,我可以看到,发送了2个cookie-看起来正常:

    再次在FireFox上,在一组Cookie标题中使用-2 Cookie:

    仅收到一个-且值不正确…:

    Firefox开发者版上也一样:

    完全困惑

    Glassfish 5使用Grizzly Framework 2.4.0(我认为在中有可用的源代码),但找不到将cookie连接在一行中的代码段

    我现在可以确认它只与HTTP/2.0协议相关,在firefox上通过启用/禁用
    network.HTTP.spdy.enabled.http2
    about:config
    进行测试。在HTTP/1.1上,通过HTTPS设置cookies,正如预期的那样。

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

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

    Grizzly从2.4.0开始支持HTTP2,但您必须。。。还有玻璃鱼

    如何配置Glassfish5发送多个集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
    
    据我所知,这个设置还没有文档化,我从中推断出了上面的命令(并在代码中一直执行到)。此外,该属性似乎未在管理控制台中公开,因此我认为除了如上所述使用
    asadmin set
    (请注意,“Version”属性是一种设置)之外,没有其他方法


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

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

    您不再需要定制的nucleus-grizzly-all.jar。本期已作为最新Glassfish 5.0夜间版和最新升级版的一部分发布


    有两个不同的问题,因为我跟踪了一个Grizzly问题的实际修复,并使用GlassFish问题来集成Grizzly。

    你能告诉我字符代码吗?该死,我刚刚意识到你在使用Firebug。。。使用HTTP/2。。。引用getfirebug.com:Firebug扩展不再被开发或维护。我们邀请您改用Firefox开发工具。好的,还有萤火虫,下一个,但是。。。你还在Firefox开发工具的网络标签上看到这个奇怪的角色吗?您如何观察到只有第一个cookie有效?是的,Firefox Developer Ed上也是如此。我可以通过工具->选项->删除单个cookie来检查收到的cookie。还注意到NetBeans IDE 8.2 HTTP服务器监视器显示请求协议HTTP/2.0,这意味着它支持HTTP/2.0?我可以确认
    asadmin设置server.network-config.protocols.protocol.HTTP-listener-2.htt‌​p、 http2已启用=fals‌​e
    正在工作,所以这是一个临时解决方案。啊,太酷了。所以我认为问题是,讨厌的字符是空字符(
    \u0000
    ),而修复提交是(尽管注释引用了grizzly中的另一个bug)