解决SpringBoot内嵌tomcat处理有特殊字符转义问题

前段时间在发生了前端调后台接口失败,原因是url中存在特殊字符,SpringBoot自带的tomcat无法正常解析,返回400 bad Request。网上搜了一下,发现是因为tomcat高版本中,更加严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范规定Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。。在这里记录一下解决过程。

SpringBoot版本为 2.2.5release(不同版本的解决方式可能不同)。

实际解决方式(针对于使用SpringBoot内置的Tomcat):添加下面的配置Bean。

    /**
     * 配置转义字符,解决当请求路径中特殊字符,高版本tomcat解析失败的问题
     */
    @Bean
    public ServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory fa = new TomcatServletWebServerFactory();
        fa.addConnectorCustomizers(connector -> {
            connector.setProperty("relaxedQueryChars", "(),/:;<=>?@[\\]{}");
            connector.setProperty("rejectIllegalHeader", "false");
        });
        return fa;
    }

(该内容只是用于记录,具体是否有效没有测试过)如果你不是使用SpringBoot的tomcat启动项目,那你就需要在tomcat的配置文件中添加以下配置信息,并重新启动。

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

 

 

 

你可能感兴趣的:(SpringBoot学习记录,问题解决)