You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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:修正编码斜杠配置(适合必须使用标准路径变量格式的场景)

按以下步骤调整即可让编码斜杠的配置生效:

  1. 若使用Spring Boot,直接在application.yml/application.properties中添加配置,替代手动设置系统属性:
    server:
      tomcat:
        encoded-slash-enabled: true # 等效于ALLOW_ENCODED_SLASH=true,Spring Boot会在Tomcat启动前完成配置
    
    非Spring Boot项目则需要将System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");放在main方法的第一行,保证在容器初始化前执行。
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:24:04