当Wildfly 21中GET请求查询参数中的管道字符(|)时,为`ERR_HTTP2_PROTOCOL_ERROR`



我们最近将一个Spring REST应用程序从Wildfly 15.0.1.Final迁移到Wildfly 21.0.0.Final,这显然引入了GET请求的问题:每当我们在GET请求的查询参数字符串中有|(管道(字符时,请求都不会返回响应,我们得到ERR_HTTP2_PROTOCOL_ERROR

我知道根据HTTP的RFC1738规范,"|"(管道(字符是不安全的,而RFC3986允许对Unicode字符进行编码。

不过,我希望这能继续工作,因为我们有外部客户端发送查询参数中包含|字符的请求,而目前如果我们移动到当前的Wildfly 21配置,这些请求将失败。

相同的配置在Wildfly 15.0.1上运行良好。最终

我在standalone.xml中有这些,但没有用:

<system-properties>
<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>
<http-listener name="default" socket-binding="http" allow-unescaped-characters-in-url="true" redirect-socket="https" enable-http2="true" url-charset="UTF-8" />
<https-listener name="https" socket-binding="https" max-post-size="1048576000" allow-unescaped-characters-in-url="true" ssl-context="LocalhostSslContext" enable-http2="true" url-charset="UTF-8" />

这在standalone.conf.bat:中

set "JAVA_OPTS=%JAVA_OPTS% -Dorg.apache.catalina.connector.URI_ENCODING=UTF-8"

在同一个虚拟机上,使用(已迁移(配置的相同代码在Wildfly 15.0.1.Final上运行良好,但只要请求中有|,就会在Wildfly 21.0.0.Final中抛出ERR_HTTP2_PROTOCOL_ERROR。在这些情况下,看起来请求甚至没有到达我的断点。

我可以通过对$.ajaxSetup中的所有|进行URL编码,以编程方式进行脏修复,但这只修复源自服务器本身的请求,而不修复在GET请求查询参数中带有|的外部请求。

脏(和不足(修复:

$.ajaxSetup({
beforeSend: function (jqXHR, settings) {
settings.url = settings.url.replace(/||/g, "%7C%7C");
}
});

有人遇到过这个问题吗?

此处为完整的standalone.xml(屏蔽敏感信息(。

编辑:在此期间,我注意到只有当我遇到Windowshosts文件中定义的端点时,才会出现此问题。当我检查我们公司的负载均衡器时,它工作得很好。

因此,例如。http://localhost.myproduct.com如果127.0.0.1 localhost.myproduct.comhosts文件中,则不能从SERVER1工作,但是https://server1.myproduct.com如果端点是通过负载均衡器路由的,那么访问同一服务器的情况会很好。

我在这个时候看到了一些相关的帖子,所有这些帖子似乎都没有得到回复。

我在Wildfly 23.0.0.Final中也遇到了类似的问题,这是一个http/2处理问题-有一个修复方法:UndertowOptions.ALLOW_UNESCAPED_CHARTERS_IN_URL对http/2没有影响,但截至本回复,AFAIK尚未在Wildffly版本中发布。

在听众身上设置enable-http2="false"虽然不理想,但对我来说解决了这个问题

这可能是因为您的负载均衡器正在后端执行http/1.1,这就是为什么您在通过它进行路由时不会遇到问题的原因。

最新更新