SpringBoot解决请求报文含有特殊字符的问题

createh52个月前 (01-26)技术教程19

前两天,和前端同事调试一个接口,一直会报一个异常

java.lang.IllegalArgumentException: Invalid character found in the request target

有点小崩溃,当时只是归结为是不是请求报文和接受格式不一致,后来上网查了查,发现方向错了[石化]

该异常的原因在于,后端SpringBoot项目是用内置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;
    }

}

另外:"\"<>[\\]^`{|}" 这个包含的特殊符号,如果不能满足需要,可以自己增加,如#等。

PS:

1.如果项目支持降低Tomcat版本,也是可以解决的。

2.如果不是使用的SpringBoot内置版本,需要在tomcat的配置文件中添加以下配置信息,并重新启动。

org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

欧克,今天的分享简而短,到此结束[奸笑]

更多内容请关注小编的公众号

Java点滴