请求:
代码:
项目整个结构:
并没有abc.html这个文件
为什么abc.html请求能匹配上 @GetMapping("/abc")?
请求:
代码:
项目整个结构:
并没有abc.html这个文件
为什么abc.html请求能匹配上 @GetMapping("/abc")?
你这应该是老版本的SpringBoot
了,首先你要知道SpringBoot
是基于Spring
的。
版本对应如下表:
序号 | SpringBoot | Springframework |
---|---|---|
1 | 2.4 | 5.3 |
2 | 2.3 | 5.2 |
3 | 2.2 | 5.2 |
4 | 2.1 | 5.1 |
5 | 2.0 | 5 |
下面说一下你这个问题,这个特性叫做后缀匹配 SuffixMatch
在老版本中,这个特性是用来识别资源类型的,比如你问题描述中,虽然代码写的是@GetMapping("/abc")
,但因为后缀匹配,实际上可以匹配"abc.html","abc.pdf","abc.json"等等,这个特性在以前是很有帮助的,但是现在浏览器可以使用"Accept" head头来指明资源类型,也就不需要SpringFramework
再"多此一举"了,而且因为这个特性的存在,很多人认为是个bug
,纷纷给Spring
提了很多 issue
所以,从Spring5.3开始,这个特性就默认关闭了,所以如果你使用的是目前最新的SpringBoot2.4,就不会遇到这个问题。
当然,既然你碰到了,想要在老版本中关闭,官方也提供了关闭办法,原文如下:
To completely disable the use of path extensions in versions prior to 5.3, set the following:
useSuffixPatternMatching(false)
, see PathMatchConfigurerfavorPathExtension(false)
, see ContentNegotiationConfigurer
既然都说到了这里,就顺便把配置类也一块给你贴上吧:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
自己粘贴到代码里试试吧,有问题欢迎私信我
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.6k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
我找到了答案,

package org.springframework.web.servlet.mvc.method.annotation;这个包下的 RequestMappingHandlerMapping类中的属性控制是否启用后缀匹配,
如果是true,/users路径 会匹配到浏览器的/users.*
值得注意的是使用的spring版本不一样这个值可能不一样,我看到的spring-webmvc-4.3.16.RELEASE.jar里面这个属性是true(这也是我发起这个问题的原因),而spring-webmvc-5.3.4.jar里是false
根据官方说法5.3之后变成了false
