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

发布于 2022-09-12 22:35:46 字数 298 浏览 15 评论 0

请求:
image.png

代码:
image.png

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自在安然 2022-09-19 22:35:46

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

喜你已久 2022-09-19 22:35:46

你这应该是老版本的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:

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

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

}

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文