Spring 5迁移:如何为所有RequestMapping添加.do后缀?
Spring 5.3.x(非Spring Boot)自动为RequestMapping添加.do后缀的解决方案
问题根源
Spring 5.2及以上版本默认禁用了后缀模式匹配(suffix pattern matching),同时DispatcherServlet的路径匹配逻辑做了调整,导致你原有的基于AbstractDispatcherServletInitializer的servlet映射配置无法自动关联到@RequestMapping的路径匹配上。
解决方案
可以通过实现WebMvcConfigurer重写路径匹配配置,同时保留原有的servlet映射规则,无需逐个修改控制器的@RequestMapping注解。
1. 配置WebMvcConfigurer开启后缀匹配
创建一个配置类,实现WebMvcConfigurer并重写configurePathMatch方法,开启后缀模式匹配并指定允许的后缀:
@Configuration public class WebMvcCustomConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { // 开启后缀模式匹配,让@RequestMapping路径自动匹配带后缀的请求 configurer.setUseSuffixPatternMatch(true); // 仅允许指定的后缀,避免安全风险,这里配置你的业务需要的do、xyz configurer.setRegisteredSuffixes(Set.of("do", "xyz")); // 若需使用Spring 5.3默认的PathPatternParser(推荐,性能更优) PathPatternParser patternParser = new PathPatternParser(); // 允许路径末尾的分隔符匹配(可选,根据你的业务需求调整) patternParser.setMatchOptionalTrailingSeparator(true); configurer.setPatternParser(patternParser); // 如果你想兼容旧版的AntPathMatcher(不推荐,仅用于特殊场景) // configurer.setPathMatcher(new AntPathMatcher()); } }
2. 保留原有的MyWebAppInitializer配置
你原有的servlet映射配置完全可以继续使用,它负责在Servlet层面将.do、.xyz、/webresources/*`的请求转发给DispatcherServlet,和上面的Spring路径匹配配置配合工作:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer { @Override protected String[] getServletMappings() { return new String[]{"*.do", "*.xyz", "/webresources/*"}; } // 其他必要的重写方法(如创建DispatcherServlet、Root上下文等)... }
关键说明
setUseSuffixPatternMatch(true)是核心配置,开启后Spring会自动将@GetMapping("welcome")这类无后缀的路径,匹配到/welcome.do、/welcome.xyz这类带后缀的请求。setRegisteredSuffixes用于限制允许的后缀,避免恶意请求利用未知后缀绕过路径匹配,建议严格配置业务所需的后缀。- 无需修改任何控制器的@RequestMapping注解,配置生效后,百余个接口会自动适配带.do/.xyz后缀的请求。
验证
启动项目后,访问/welcome.do应该能正常映射到标注了@GetMapping("welcome")的控制器方法,同时/webresources/*路径下的静态资源仍能正常访问。
内容的提问来源于stack exchange,提问作者Bernie
相关产品推荐
相关产品推荐

