Spring MVC 4.2.1参数含%2F返回404,需保留URL结构解决
我之前也碰到过一模一样的糟心事!谷歌已经把带%2F的URL索引了,结果Spring MVC一收到请求就把%2F解码成斜杠,直接导致路径匹配失败返回404,关键还不能改URL结构——毕竟排名靠前的页面动不得。不过后来折腾出几个不用改URL、纯靠注解和配置就能解决的办法,给你分享下:
Spring Boot 2.4+引入了新的PathPatternParser路径解析器,它支持控制是否解码路径中的%2F。只要开启这个解析器并关闭斜杠解码,就能让路径变量里的%2F完整保留,控制器的@RequestMapping就能正确匹配请求。
如果你用的是Spring Boot,直接在配置文件里加参数:
# application.properties spring.mvc.pathmatch.matching-strategy=PATH_PATTERN_PARSER spring.mvc.pathpattern.parser.decode-slash=false或者YAML格式:
# application.yml spring: mvc: pathmatch: matching-strategy: PATH_PATTERN_PARSER pathpattern: parser: decode-slash: false如果是纯Spring MVC项目(非Boot),可以通过
WebMvcConfigurer配置类来设置:@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { PathPatternParser parser = new PathPatternParser(); parser.setDecodeSlash(false); // 禁止解码%2F configurer.setPathPatternParser(parser); } }
这个方案的好处是完全在Spring层面控制,不需要修改容器配置,安全性也更高。
如果上面的方案不适用(比如用了旧版本Spring),可以直接调整Servlet容器的参数,让它不要提前解码%2F。以Tomcat为例:
Spring Boot项目直接在配置文件加:
server.tomcat.allow-encoded-slash=true这个参数会让Tomcat允许URL中存在编码后的斜杠,不会把
%2F转成真实斜杠,这样Spring MVC就能拿到原始的%2F作为路径变量的一部分。⚠️ 注意:这个方案有一定安全风险,允许编码斜杠可能被用于路径遍历攻击。所以一定要确保你的路径变量(比如示例里的
Neustad%2FNord_DE)有严格的格式校验,避免恶意输入。
配置完之后,可以在控制器里打印路径变量的值,确认是否拿到了带%2F的原始字符串:
@GetMapping("/forecast/{locationRequest:.+}") public String getForecast(@PathVariable String locationRequest) { System.out.println(locationRequest); // 应该输出Neustad%2FNord_DE,而不是Neustad/Nord_DE // 后续业务逻辑 return "forecast"; }
只要能正确打印出包含%2F的参数,说明配置生效,请求也不会再返回404了。
内容的提问来源于stack exchange,提问作者Alex Ul

