vlambda博客
学习文章列表

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中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])**

    

    然后,我们看了一下请求报文,的确存在敏感字符,突然间,就云消雾散了,经整理,需要添加一个配置方可解决Tomcat8及以上特殊字符转义问题


    代码如下:


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点滴