描述:在业务对接的时候有个接口中的参数是包含特殊字符的,如下图:
由于有特殊字符,会被tomcat拦截,因此需要做一些处理
解决:
(1)在springboot项目中:
注入bean
@Bean public ConfigurableServletWebServerFactory webServerFactory() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addConnectorCustomizers(connector -> { connector.setProperty("relaxedQueryChars", "|{}[]"); }); return factory; }
(2)在tomcat中:
修改conf目录下server.xml,加入
relaxedPathChars="|{}[]"
relaxedQueryChars="|{}[]"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" relaxedPathChars="|{}[]" relaxedQueryChars="|{}[]"/>
参考:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html
(3)在网上还查到另一种解决方案:
修改conf/catalina.properties
在最后加上
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
问题:虽然在tomcat8,tomcat9的文档中都写了relaxedQueryChars,relaxedPathChars两个参数的用法,但是在某些版本里面并不适用,我经常使用的tomcat8.5这个版本是生效的.tomcat9.0.5这个版本的不生效的,tomcat8.0.43这个版本是生效的.