【sping揭秘】26、Springmvc中的requestMapping是如何匹配的——url尾部加/

尾部加”/”匹配useTrailingSlashMatch

参数初始化

参数初始化取决于requestMapping这个bean,这个bean在spring的IOC容器中初始化

我们重载一下requestMapping这个类即可

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

而在springboot中的初始化的bean名称默认是requestMappingHandlerMapping
而使得这个bean注入的类是WebMvcAutoConfiguration

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.EnableWebMvcConfiguration#requestMappingHandlerMapping

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

也是WebMvcConfigurationSupport 这个类,也就是说在初始化这个类的时候会注入mapping的对象

通过观察源码,EnableWebMvcConfiguration初始化最终还是在WebMvcConfigurationSupport中进行初始化mapping对象

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

通过继承我们发现support才是真正的注入方法类
这个创建bean的方法中有这样一段代码

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

打开进去看看

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

到这里我们发现这个对象的初始化是new出来,也就是说无法配置,都是默认设置的值,但是同时我们注意到下面有个config方法,我们进去看看

看一下是哪里调用了configurePathMatch方法

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

我们发现是这个类调用了,然后循环处理配置,我们看一下这个代理的配置从哪来的

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

继续探讨

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

最终我们观察到注入进来的类是
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter,继续追踪

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

这个地方就是这种path匹配规则的地方,但是在这个类中,没有设置我们想要修改的值
Mvc默认在yml文件中的配置也不支持

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

那么就只能自己重载一下

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

直接重载这里会有个问题,因为ResourceHandlerRegistrationCustomizer不是spring对外公开的类,那么这里直接使用就会报错

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

我们需要实现这类

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

至此大工告成,运行起来看看

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

下面是false的原因是我修改yml文件配置

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

匹配规则

  1. Controller中的匹配规则不是/结尾的
  2. 请求的路径是Controller中路径+/的组合

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

如果匹配成功,返回匹配成功的结果

验证结果

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

修改配置

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

路径匹配失败

【sping揭秘】26、Springmvc中的requestMapping是如何匹配的------url尾部加/

总结

研究这个问题的主要原因是,springmvc会默认吧这个斜杠匹配到不带斜杠的路径上,这样就可能对我们的路径匹配有困扰
如果我们是用springmvc的pattern进行匹配鉴权的url,那么就可以通过构建一个斜杠的url去绕过校验,这个时候我们吧这个配置关掉就可以避免这种情况

Original: https://www.cnblogs.com/cutter-point/p/16163070.html
Author: cutter_point
Title: 【sping揭秘】26、Springmvc中的requestMapping是如何匹配的——url尾部加/

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570646/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring Cloud Gateway 请求报文获取 高性能实现方法

    1 简介 本文使用的spring cloud版本:2020.0.1 关于Spring Cloud Gateway报文获取,网上写法较多参考ModifyRequestBodyGate…

    Java 2023年5月30日
    082
  • 【leetcode】 15. 三数之和

    题目 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意…

    Java 2023年6月6日
    0119
  • JavaSE——调试

    Loading 多动手,多思考,变量和方法写注释!!! idea中ctrl+alt+l失效 解决办法:关闭应用中的快捷键 不换行输出数据 创建包不能添加java 解决,改成中文看看…

    Java 2023年6月6日
    093
  • 数据库篇:mysql锁详解

    前言 sql事务的执行,如果需要锁定数据进行更新操作,则必定离不开锁 共享锁和排他锁 表锁 行锁 Record Lock 间隙锁 Gap Lock 行锁+间隙锁 Next-Key …

    Java 2023年6月5日
    089
  • EasyExcel 自定义表头,表头合并,数据合并,自定义字体背景色

    1 public void export(HttpServletResponse response, PlanExportQuery query) { 2 //查询所有数据 3 L…

    Java 2023年6月8日
    0101
  • java使用poi导出excel

    继上一篇导出pdf,这篇导出excel。 1、导入依赖 2、代码 import java.io.OutputStream;import java.net.URLEncoder; i…

    Java 2023年6月13日
    071
  • SpringCloudStream消息驱动的使用以及解决消息重复消费

    场景 SpringCloudConfig集成Bus消息总线实现动态刷新配置(全局广播和定点通知): https://blog.csdn.net/BADAO_LIUMANG_QIZH…

    Java 2023年5月30日
    083
  • MQTT 入门(3)–MQTT QoS 详解

    本文主要介绍 MQTT 协议中 QoS(服务质量) 的详细内容。 1、概述 MQTT 协议 中规定了消息服务质量(Quality of Service),它保证了在不同的网络环境下…

    Java 2023年6月16日
    094
  • SpringBoot自定义starter

    一、starter的构成 xxx-starter—–>xxx-starter-autoconfigurer 启动器—–>…

    Java 2023年5月30日
    086
  • 非易失性规划的原理与实现方法

    常言道,计划不如变化快。计划的制定本身就建基于对未来一定时间范围内的环境条件假设,当计划制定后到执行完成的时间段内,若环境条件发生变化,那么计划也需要进行适当的调整才能满足实际要求…

    Java 2023年6月16日
    088
  • 基础常用API总结2

    java.lang包下 返回值类型 方法 功能 boolean matches(String regex) 如果 当前字符串中regex(正则表达式)所表示的字符,如果有返回tur…

    Java 2023年6月8日
    0103
  • 将springboot安装成windows服务启动。

    下载Windows Service Wrapper 本文下载了winsw-2.3.0-bin.exe。 新建一个目录aiplatformService 在目录里面新建一个aipla…

    Java 2023年5月30日
    0112
  • nodejs解压版安装和配置(带有搭建前端项目脚手架)

    nodejs 安装 我先前用了nvm,觉得nvm挺厉害可以随时更换nodejs版本,但是研究了下,可能自己功力不够还是什么,并不好用,中间还出现了错误;所以最后还是卸载了; 本文图…

    Java 2023年6月16日
    067
  • SpringBoot整合reids之JSON序列化文件夹操作

    前言 最近在开发项目,用到了redis作为缓存,来提高系统访问速度和缓解系统压力,提高用户响应和访问速度,这里遇到几个问题做一下总结和整理 快速配置 SpringBoot整合red…

    Java 2023年6月13日
    071
  • 反转链表_206_92_25

    题目描述: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 题目描述: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left 给…

    Java 2023年6月5日
    0110
  • explain的基本使用介绍

    在进行mysql操作的时候,主要是crud. 更主要的是进行查询的操作.在开发工作过程中往往会遇到慢查询,导致整个程序很慢.这个时候就需要开发人员进行慢查询的分析.这个过程比较漫长…

    Java 2023年6月6日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球