Spring框架从3.2.9升级至5.3.22后,带.html后缀的URL无法访问
问题原因
Spring Framework 5.2及以上版本,MVC默认路径匹配策略从AntPathMatcher切换为PathPatternParser,后者默认不匹配带扩展名的URL(如ssoLogin.html)。而Spring 3.x使用的AntPathMatcher会自动忽略扩展名来匹配@RequestMapping定义的路径,这就导致升级后ssoLogin.html无法匹配到标注@RequestMapping("/ssoLogin")的控制器,返回404。
解决方案
以下几种方案可解决该问题:
方案1:切换回旧的AntPathMatcher匹配策略
在DispatcherServlet配置文件(DispatcherServlet.xml)中添加配置,强制使用原有路径匹配规则:
<mvc:annotation-driven path-matching="ant-path-matcher"/>
若使用Java配置,对应代码如下:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setPathMatcher(new AntPathMatcher()); } }
方案2:配置PathPatternParser允许扩展名匹配
如果希望保留新的PathPatternParser,可以配置它支持后缀匹配:
<mvc:annotation-driven> <mvc:path-matching suffix-pattern="true" registered-suffixes-only="false"/> </mvc:annotation-driven>
suffix-pattern="true":开启后缀模式匹配registered-suffixes-only="false":允许匹配所有扩展名(若仅需支持特定扩展名,可设为true并配置registered-suffixes指定允许的扩展名)
Java配置方式:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { PathPatternParser parser = new PathPatternParser(); parser.setUseSuffixPatternMatch(true); parser.setUseRegisteredSuffixPatternMatch(false); configurer.setPatternParser(parser); } }
方案3:调整控制器注解或访问URL
- 修改控制器注解,包含扩展名:
@RequestMapping("/ssoLogin.html") - 直接使用不带扩展名的URL访问:
ssoLogin
额外说明
你的web.xml中DispatcherServlet的映射配置本身无问题,核心矛盾来自路径匹配策略的变更;视图解析器配置仅影响视图渲染,与请求映射匹配无关。
内容的提问来源于stack exchange,提问作者Dhaval Bhoot
相关产品推荐
相关产品推荐

