如何在@SpringBootApplication中允许路径变量包含编码斜杠
Spring路径变量传入含斜杠内容的可行解决方案
你配置的ALLOW_ENCODED_SLASH不生效的核心原因是配置时机晚于Tomcat解码器初始化阶段,系统属性需要在Tomcat组件加载前完成设置才会生效。以下是3种经过验证的可行方案:
方案1:使用Spring路径通配符匹配(最便捷,无需编码)
Spring 3.2+ 支持{*变量名}的路径匹配语法,会将匹配位置之后的完整路径(包含所有斜杠)全部赋值给对应路径变量,不需要额外服务端配置,也不需要客户端编码。
修改接口代码如下:
@GetMapping("/greeting/{*name}") public Greeting greeting(@PathVariable(value = "name") String name) { // Spring会自动处理前缀匹配,请求/greeting/test/slash时,name拿到的值就是test/slash return new Greeting(counter.incrementAndGet(), String.format(template, name)); }
直接请求http://localhost:8080/greeting/test/slash即可正常响应,无404问题。
方案2:修正编码斜杠配置(适合必须使用标准路径变量格式的场景)
按以下步骤调整即可让编码斜杠的配置生效:
- 若使用Spring Boot,直接在
application.yml/application.properties中添加配置,替代手动设置系统属性:
非Spring Boot项目则需要将server: tomcat: encoded-slash-enabled: true # 等效于ALLOW_ENCODED_SLASH=true,Spring Boot会在Tomcat启动前完成配置System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");放在main方法的第一行,保证在容器初始化前执行。 - 配置Spring MVC的路径解析规则,避免二次解码导致的问题,添加如下配置类:
配置完成后客户端单次编码斜杠为@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { UrlPathHelper urlPathHelper = new UrlPathHelper(); urlPathHelper.setUrlDecode(false); // 禁止Spring对路径再次解码 configurer.setUrlPathHelper(urlPathHelper); } }%2F,请求http://localhost:8080/greeting/test%2Fslash即可正常拿到test/slash的参数值。
方案3:改用请求参数传递(最稳妥,无编码冲突)
如果对路径格式没有强制要求,直接将含特殊字符的参数放到请求参数中,不需要额外配置即可支持斜杠:
@GetMapping("/greeting") public Greeting greeting(@RequestParam(value = "name") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); }
直接请求http://localhost:8080/greeting?name=test/slash即可正常获取参数。
内容的提问来源于stack exchange,提问作者Edu
相关产品推荐
相关产品推荐

