Tomcat8及以上特殊字符转义问题
之前与前端同事,调试一个接口,一直会报一个异常
java.lang.IllegalArgumentException:
Invalid character found in the request target
有点小崩溃,当时只是归结为是不是请求报文和接受格式不一致,后来上网查了查,发现方向错了。该异常的原因在于,后端项目是用内置tomcat启动的,版本为tomcat9,但是tomcat版本大于8.0对请求URL做了严格的过滤, RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])**
然后,我们看了一下请求报文,的确存在敏感字符,突然间,就云消雾散了,经整理,需要添加一个配置方可解决
代码如下:
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;
/**
* @日期: 2021/1/18
* @作者: dd
* @描述: 非法字符转义-tomcat8及以上
*/
@Configuration
public class TomcatConfig {
@Bean
public TomcatServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers((Connector connector) -> {
connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
});
return factory;
}
}
另外:"\"<>[\\]^`{|}" 这个包含的特殊符号,如果不能满足需要,可以自己增加,如#等。
其他解决方法:降低tomcat版本。
注:如果不是使用的SpringBoot内置版本,需要在tomcat的配置文件中添加以下配置信息,并重新启动。
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
欧克,今天的小笔记到此结束,喜欢的小伙伴点个关注。
【头条号】:Java点滴