我们最近将一个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.com
在hosts
文件中,则不能从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,这就是为什么您在通过它进行路由时不会遇到问题的原因。