为什么abc.html请求能匹配上 @GetMapping("/abc")?

weisir
  • 9

请求:
image.png

代码:
image.png

项目整个结构:
image.png
并没有abc.html这个文件
为什么abc.html请求能匹配上 @GetMapping("/abc")?

回复
阅读 464
2 个回答

我找到了答案,
image.png
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
image.png

你这应该是老版本的SpringBoot了,首先你要知道SpringBoot是基于Spring的。
版本对应如下表:

序号SpringBootSpringframework
12.45.3
22.35.2
32.25.2
42.15.1
52.05

下面说一下你这个问题,这个特性叫做后缀匹配 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:

既然都说到了这里,就顺便把配置类也一块给你贴上吧:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
    }
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }

}

自己粘贴到代码里试试吧,有问题欢迎私信我

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏