【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/713228/

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

(0)

大家都在看

  • 账号分享

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年6月22日
    0100
  • 音频之时域&频域

    一. 时域 & 频域 时域和频域是音频应用中最常用的两个概念,也是衡量音频特征的两个维度概念。 时域图如下: 横轴是时间,纵轴是声音强度,可知时域图是从时间维度来衡量一段音…

    技术杂谈 2023年5月31日
    092
  • SpringSecurity 自定义表单登录

    SpringSecurity 自定义表单登录 本篇主要讲解 在SpringSecurity中 如何 自定义表单登录 , SpringSecurity默认提供了一个表单登录,但是实际…

    技术杂谈 2023年7月11日
    069
  • 面向对象ooDay4

    多种角色能干的事都一样的时候,可以将多种角色统一造型到超类数组中,实现代码复用 eg: 学生/老师/医生都是输出名字+问好——干的事都一样, ​ 就可以将学…

    技术杂谈 2023年7月11日
    056
  • 关于大衍求一术的一个延拓

    今天是一个明朗的日子,心情闲暇,于是,研究了一下我国的算术,我国的算术其实是非常博大精深的,只是由于某些偶然原因,我国算术没能发展起来,否则,现代算术中心必在东方之华夏,在我的印记…

    技术杂谈 2023年5月31日
    090
  • Vue学习笔记(二):Vue实例与指令

    每一个Vue应用都要通过Vue实例实现,实例化Vue语法格式如下: 接下来,通过一个代码段说明Vue构造器有哪些基本内容: 上述示例中是在创建Vue实例时与div容器进行挂载,这是…

    技术杂谈 2023年7月24日
    074
  • Netty源码分析之ByteBuf(一)—ByteBuf中API及类型概述

    ByteBuf是Netty中主要的数据容器与操作工具,也是Netty内存管理优化的具体实现,本章我们先从整体上对ByteBuf进行一个概述; AbstractByteBuf是整个B…

    技术杂谈 2023年7月25日
    059
  • 在windows下使用s3cmd和s3browser来管理amazon s3的笔记

    S3是Amazon S3的简称,s3cmd是一款命令行工具用来管理s3,同时还有一款图形化的管理工具:s3 browser。 因为绝大多数用户都是在linux下管理s3,而我们的打…

    技术杂谈 2023年6月1日
    0116
  • java实现红黑树

    好久没更新了 今天发个有点技术含量的 java实现红黑树代码 下面是代码 由于我才疏学浅 和自己对于特别复杂的问题的讲解能力问题 可能不能特别清晰明了的为大家讲解清晰 后面会抽时间…

    技术杂谈 2023年7月24日
    073
  • 005 Linux 命令三剑客之-sed

    grep:数据查找定位 awk:数据切片,数据格式化,功能最复杂 *sed:数据修改 三剑客各有所长,和锅锅一一搞起就是了! sed:擅长数据修改。 grep:擅长数据查找定位。 …

    技术杂谈 2023年7月10日
    057
  • 实践GoF的设计模式:迭代器模式

    摘要:迭代器模式主要用在访问对象集合的场景,能够向客户端隐藏集合的实现细节。 有时会遇到这样的需求,开发一个模块,用于保存对象;不能用简单的数组、列表,得是红黑树、跳表等较为复杂的…

    技术杂谈 2023年5月31日
    0101
  • 李超:WebRTC传输与服务质量

    为了保证音视频的质量,WebRTC底层做了大量的工作,尤其是网络传输与服务质量,更是其核心技术,本文由北京音视跳动科技有限公司 首席架构师 李超在LiveVideoStack线上分…

    技术杂谈 2023年5月31日
    075
  • 「游记」CSP-S2021爆零记

    今年的线上提交系统很坑,长时间不操作就会退出登录。还好中途学校老师有提醒先提交一部分,让我发现已退出登录,不然等最后提交就要「爆零」了(据说福建有不少选手这样),在此感谢学校老师。…

    技术杂谈 2023年7月24日
    063
  • 树形dp(背包)

    树形dp 样题: 没有上司的舞会 某大学有 (n) 个职员,编号为 (1\ldots n)。 他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上…

    技术杂谈 2023年7月11日
    070
  • 威胁分析和风险分析

    三个定义:威胁(Threat),指的是可能造成危害的来源。风险(Risk),可能造成的损失。漏洞,系统中可能被威胁利用从而造成危害的地方。 威胁分析就是把 系统中存在的威胁全部找出…

    技术杂谈 2023年6月21日
    0113
  • 特征脸(Eigenface)理论基础-PCA(主成分分析法)

    在之前的博客 人脸识别经典算法一:特征脸方法(Eigenface) 里面介绍了特征脸方法的原理,但是并没有对它用到的理论基础PCA做介绍,现在做补充。请将这两篇博文结合起来阅读。以…

    技术杂谈 2023年5月31日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球