Spring Boot 内置 Tomcat 解析特殊符号参数错误的问题
原创2021/9/1小于 1 分钟
Spring Boot 内置 Tomcat 解析特殊符号参数错误的问题
1、业务背景
Spring Boot 项目中,使用内置的 Tomcat 容器,版本为 9.x
2、问题现象
在对 H5 页面进行推广中,会有个别平台在路径后面拼接参数,参数中会有“{}”中括号等特殊字符,导致请求访问报 400 异常:
java.lang.IllegalArgumentException: Invalid character found in the request target [/?xxx=xxx...]
The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:494) ~[tomcat-embed-core-9.0.50.jar!/:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:269) ~[tomcat-embed-core-9.0.50.jar!/:na]
......3、定位原因
在后来高版本的 Tomcat 中,会默认对一些特殊符号进行拦截,如“{}”、“[]”...
4、解决方案
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* TomcatConfig
*
* @author Jastar Wang
* @date 2021/9/1
* @since 1.0
*/
@Configuration
public class TomcatConfig {
@Bean
public TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connector connector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
});
return factory;
}
}
