前两天宋哥给大家分享了如何在SpringSecurity中实现权限通配符的功能,其中使用了一个“迂回的方式”AntPathMatcher。有朋友对此不熟悉,问宋哥能不能单独介绍一下这个东西。好的,安排!然而,AntPathMatcher实际上正在逐渐过时。它的替代品是PathPattern。我把这两个放在一起分享给大家。Spring5也出来很久了,还有一些新的玩法需要我们慢慢去发掘。其中,系统解析当前请求路径的方法位于:org.springframework.web.servlet.handler.AbstractHandlerMapping#initLookupPath:protectedStringinitLookupPath(HttpServletRequestrequest){if(usesPathPatterns()){request.removeAttribute(UrlPathHelper.PATH_ATTRIBUTE);RequestPathrequestPath=ServletRequestPathUtils.getParsedRequestPath(请求);StringlookupPath=requestPath.pathWithinApplication().value();返回UrlPathHelper.defaultInstance。removeSemicolonContent(lookupPath);}else{returngetUrlPathHelper().resolveAndCacheLookupPath(request);}}这个方法是Spring5出来的,之前没有这个方法。在旧的SpringMVC中,当我们需要获取当前请求地址时,可以直接通过以下方法获取:StringlookupPath=this.getUrlPathHelper().getLookupPathForRequest(request);但是现在变了,现在我们获取当前请求的URL地址时,方法如下:StringlookupPath=initLookupPath(request);两种方法相比,主要是initLookupPath方法中多了usesPathPatterns的选项,这是Spring5的新东西,所以今天松哥通过一篇简单的文章给大家分享一下usesPathPatterns到底是什么以及怎么玩它!这是一个不小的变化!特别是如果你的项目中使用了WebFlux,那么这个东西就尤为重要了!1.AntPathMatcher当我们使用@RequestMapping注解来标记请求接口时(或者使用它类似的方法如@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping),我们可以使用一些通配符来匹配URL地址,例如一个简单的例子,假设我有以下五个接口:@GetMapping("/hello/**/hello")publicStringhello(){return"/hello/**/hello";}@GetMapping("/h?llo")publicStringhello2(){return"/h?llo";}@GetMapping("/**/*.html")publicStringhello3(){return"/**/*.html";}@GetMapping("/hello/{p1}/{p2}")publicStringhello4(@PathVariableStringp1,@PathVariableStringp2){System.out.println("p1="+p1);System.out.println("p2="+p2);返回“/你好/{p1}/{p2}";}@GetMapping("/{名称:[a-z-]+}-{版本:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")publicvoidhandle(@PathVariableStringname,@PathVariableStringversion,@PathVariableStringext){System.out.println("name="+name);System.out.println("version="+version);System.out.println("ext="+ext);}在解释接口含义之前,先说说这几个通配符的含义:通配符含义**匹配0个或多个目录*匹配0个或多个字符?匹配任意单个字符理解了通配符的含义后,再说说每个接口可以接收到哪些请求:第一个接口可以接收请求比如/hello/123/123请求比如/hello,/hello/a/hello和/hello/hello,因为中间的**代表0个或多个目录。第二个接口可以接收/hallo,/hello,/hMllo等请求,注意不能接收/haallo或/hllo,因为?代表一个字符。第三个接口可以接收任何request后缀为.html,例如/aaa/bb/cc.html、/aa.html或/aa/aa.html。第四个界面想必大家都很熟悉吧。RESTful风格的界面设计,估计大家都用过。它接收到的请求格式类似于/hello/aa/bb,其中参数p1对应aa,参数p2对应bb。第五个接口使用正则表达式,name、version、ext三种参数格式用正则表达式表示,可以接收/spring-web-3.0.5.jar等格式的请求,最终参数名称为spring-web,版本是3.0.5,ext是.jar。这是之前在SpringMVC中就有的一个功能,不管你有没有用过,反正它是存在的。那么是谁支持这个功能呢?那就是AntPathMatcher。AntPathMatcher是Ant风格的路径匹配器。Ant风格的路径规则其实就是我们前面介绍的三种路径匹配器,非常easy。此路径匹配规则来自ApacheAnt项目(https://ant.apache.org)。ApacheAnt现在我们用的很少了。它的替代者是著名的Maven。如果你有幸维护一些2010年之前的老项目,就有可能接触到Ant。AntPathMatcher其实在SpringMVC中的应用非常广泛,不仅是在@RequestMapping中定义接口,其他涉及到地址匹配的地方也可以使用。比如我们在SpringMVC的配置文件中配置静态资源过滤Ant风格的路径匹配:
