今天要说的是路径模式匹配,有些小伙伴可能不知道这是干嘛用的,但我相信你肯定在代码或配置文件中使用过,下面的场景你肯定不陌生:
•spring启动加载Class文件•springmvc中RequestMappping中的uri匹配,uri中动态变量值的获取•spring security中排除不需要鉴权的访问uri•maven、gradle中include、exclude文件•sonar扫描的时候排除某类文件或者排除某个目录下的文件(支持模式排除某个目录或某些文件可以说是扫码类工具必备的功能)
在上述场景中基本都使用了AntPathMatcher模式,AntPatchMatcher是实现了Ant风格的路径匹配器,这种路径匹配规则源自Apache Ant项目,Ant可能年轻的小伙伴都没用过,但是其路径匹配风格得到了继承。如在org.springframework.util包中就可以看到现有的AntPathMatcher.java的身影。
spring启动过程中使用
上图为spring启动过程中扫描加载类路径下所有匹配*/.class 模式的类文件
SpringMvc中使用
上图是启动spring项目后,访问http://localhost:8080/api/hello/11111/n666时debug的调用栈截图,可以看到在doService()->doDispatch()->getHandler()->...handleMatch() 方法里使用到了AntPathMatcher.extractUritemplateVariables()方法
在上面的debug的variables视图中可以看到URI中的{id}和{name}对应到了值11111和n2222
SpringSecurity中使用
如上图所示我们可以继承WebSecurityConfigurerAdapter然后重写configure方法,全局配置不需要登录访问的接口、静态资源等,这里也是使用了Ant路径模式匹配
maven、gradle中使用
上图是maven使用jacoco生成单元测试覆盖率时,配置需要排除的文件
上图是gradle打jar包的时候配置include和 exclude的文件
Sonarqube中使用
sonarqube中的WildcardPattern,该类也是Ant风格模式匹配的一个实现类,是基于正则实现的,注释用也提到了spring中的实现AntPatherMatcher
该类的帮助中还提到了intellij-community中的实现FileUtil.java 工具类,文件地址如下,有兴趣的同学可看下
https://github.com/JetBrains/intellij-community/blob/master/platform/util/src/com/intellij/openapi/util/io/FileUtil.java
Ant路径模式匹配
上面org.springframework.util.AntPathMatcher工具类的注释截图,我们可以看到Ant路径模式匹配的基本规则如下:
•? 匹配一个字符(除过操作系统默认的文件分隔符)•* 匹配0个或多个字符•**匹配0个或多个目录•{spring:[a-z]+} 将正则表达式[a-z]+匹配到的值,赋值给名为 spring 的路径变量。下图是AntPathMatcher类的常用方法:[图片上传失败...(image-872d2c-1653833254878)]
结论
上文只是列举出了几个常用使用场景,实际上使用到路径模式匹配的地方还有很多。这里通过一些使用场景截图、Debug Spring启动,Rest接口访问路径参数的获取,让大家直观的看到路径模式匹配在开发过程中确实被经常的使用到。我们可根据自己实际的需求灵活的使用Ant路径模式匹配。
备注:
•在Spring5.3.x中已经不再使用AntPathMather作为uri路径匹配的工具类,取而代之的是org.springframework.web.util.pattern.PathPattern,所属模块为spring-web•在sonarqube7.9.x版本的源码中org.sonar.api.utils.WildcardPattern工具类在sonarqube的master分支中已经找不到,应该是有其他的方式实现了。
参考
[1]
https://blog.csdn.net/f641385712/article/details/118031407
[2]
https://www.bilibili.com/read/cv10180021/
[3]
https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/uri-pattern.html
[4]
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html