之前与前端同事,调试一个接口,一直会报一个异常
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及以上 */@Configurationpublic 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点滴