异常-400- Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

描述:在业务对接的时候有个接口中的参数是包含特殊字符的,如下图:

 由于有特殊字符,会被tomcat拦截,因此需要做一些处理

解决:

(1)在springboot项目中:

注入bean

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers(connector -> {
            connector.setProperty("relaxedQueryChars", "|{}[]");
        });
        return factory;
    }

(2)在tomcat中:

修改conf目录下server.xml,加入

relaxedPathChars="|{}[]"
relaxedQueryChars="|{}[]"
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               relaxedPathChars="|{}[]"   
               relaxedQueryChars="|{}[]"/>

参考:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

(3)在网上还查到另一种解决方案:

修改conf/catalina.properties

在最后加上

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

问题:虽然在tomcat8,tomcat9的文档中都写了relaxedQueryChars,relaxedPathChars两个参数的用法,但是在某些版本里面并不适用,我经常使用的tomcat8.5这个版本是生效的.tomcat9.0.5这个版本的不生效的,tomcat8.0.43这个版本是生效的.

原文地址:https://www.cnblogs.com/excellencesy/p/14499346.html