springboot中URL带有斜杠的转义字符%2F导致的400错误

3,770 阅读1分钟

背景: 今天项目上出现一个问题,是前端的GET请求url中带有路径参数,这个参数中有/这个特殊字符,在postman的url中已经转移成了%2F,后端用的是springboot,并没有收到这个请求,直接返回了400的错误

原因: 据说是tomcat默认是不支持转义的,需要手动设置一下转化,这个搜索tomcat的设置可以找到,但是这个是springboot,有内置的tomcat,但是在yml中找不到相关的配置。

解决方法: 修改一下启动类,加一个系统参数,重写WebMvcConfigurerAdapter的configurePathMatch方法.

@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) throws Exception {
     // step2:
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        SpringApplication.run(Application.class, args);
    }

  // step1: 
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }

}
本地tomcat 中该如何设置呢? (本例是修改SpringBoot 内嵌 的 tomcat 配置)
在tomcat目录 /conf/catalina.properties 文件末尾添加下列内容

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

重启tomcat成功解决问题

其他常用特殊字符的url转义用法如下
符号URL中转义结果转义码
+URL 中 + 号表示空格%2B
空格URL中的空格可以用+号或者编码%20
/分隔目录和子目录%2F
?分隔实际的URL和参数%3F
%指定特殊字符%25
#表示书签%23
&URL中指定的参数间的分隔符%26
=URL中指定参数的值%3D
引用

springboot中URL带有斜杠的转义字符%2F导致的400错误