问答

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

作者:admin 2021-04-21 我要评论

请求: 代码: 项目整个结构: 并没有abc.html这个文件 为什么abc.html请求能匹配上 @GetMapping("/abc")? ### 我找到了答案, package org.springframework.we...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

请求:
image.png

代码:
image.png

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

###

我找到了答案,
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);
??? }

}

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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 为什么abc.html请求能匹配上 @GetMappi

    为什么abc.html请求能匹配上 @GetMappi

  • vue移动端获取不到eggjs数据

    vue移动端获取不到eggjs数据

  • python程序跑着突然报错,大佬们快进来

    python程序跑着突然报错,大佬们快进来

  • vue3 setup语法糖 父组件如何调用子组

    vue3 setup语法糖 父组件如何调用子组

腾讯云代理商
海外云服务器