基于Spring概念模型:PathMatcher|基于Spring概念模型:PathMatcher 路径匹配器
目录
- 概述
- PathMatcher接口源代码
- AntPathMatcher使用例子
- spring的路径匹配工具 AntPathMatcher
- 以下代码为本人使用过的路径匹配工具代码
- 核心代码是这一行
概述 PathMatcher是Spring的一个概念模型接口,该接口抽象建模了概念"路径匹配器",一个"路径匹配器"是一个用于路径匹配的工具。它的使用者是 :
org.springframework.core.io.support.PathMatchingResourcePatternResolverorg.springframework.web.servlet.handler.AbstractUrlHandlerMappingorg.springframework.web.servlet.mvc.WebContentInterceptor
Spring框架自身对概念模型接口也提供了一个缺省的实现AntPathMatcher,用于匹配Ant风格的路径。
PathMatcher接口源代码
PathMatcher接口源代码如下 :
package org.springframework.util; import java.util.Comparator; import java.util.Map; public interface PathMatcher { /*** Does the given path represent a pattern that can be matched* by an implementation of this interface?* 判断指定的路径 path 是否是一个 pattern(模式)* 如果返回值是 false,也就是说 path 不是一个模式,而是一个静态路径(真正的路径字符串),* 那么就不用调用方法 #match 了,因为对于静态路径的匹配,直接使用字符串等号比较就足够了。* @param path the path String to check* @return true if the given path represents a pattern*/ boolean isPattern(String path); /*** Match the given path against the given pattern,* according to this PathMatcher's matching strategy.* 根据当前 PathMatcher 的匹配策略,检查指定的径 path 和指定的模式 pattern 是否匹配* @param 用于检测路径字符串是否匹配于某个模式时所用的模式* @param path 需要被检测的路径字符串* @return true 表示匹配, false 表示不匹配*/ boolean match(String pattern, String path); /*** Match the givenpath against the corresponding part of the given* pattern, according to this PathMatcher's matching strategy.* 根据当前 PathMatcher 的匹配策略,检查指定的径 path 和指定的模式 pattern 是否之间* 是否为前缀匹配* @param pattern the pattern to match against* @param path the path String to test* @return true 表示匹配, false 表示不匹配*/ boolean matchStart(String pattern, String path); /*** Given a pattern and a full path, determine the pattern-mapped part.* 给定一个模式 pattern 和一个全路径 path,判断路径中和模式匹配的部分。** This method is supposed to find out which part of the path is matched* dynamically through an actual pattern, that is, it strips off a statically* defined leading path from the given full path, returning only the actually* pattern-matched part of the path.* 该方法用于发现路径中的哪一部分是和模式能动态匹配上的部分。它会去除路径中开头静态部分,* 仅仅返回那部分真正和模式匹配的上的部分。* 例子 : "myroot/*.html" 为 pattern , "myroot/myfile.html" 为路径,*则该方法返回 "myfile.html".* 具体的检测规则根据当前 PathMatcher 的匹配策略来顶。 * A simple implementation may return the given full path as-is in case* of an actual pattern, and the empty String in case of the pattern not* containing any dynamic parts (i.e. the pattern parameter being* a static path that wouldn't qualify as an actual #isPattern pattern.* A sophisticated implementation will differentiate between the static parts* and the dynamic parts of the given path pattern.* @param pattern the path pattern* @param path the full path to introspect* @return the pattern-mapped part of the given path* (never null)*/ String extractPathWithinPattern(String pattern, String path); /*** Given a pattern and a full path, extract the URI template variables. URI template* variables are expressed through curly brackets ('{' and '}').* 给定一个模式和一个路径,提取其中的 URI 模板变量信息。URI模板变量表达式格式为 "{variable}"** 例子 : pattern为 "/hotels/{hotel}" ,路径为 "/hotels/1", 则该方法会返回一个 map ,* 内容为 : "hotel"->"1".* @param pattern the path pattern, possibly containing URI templates* @param path the full path to extract template variables from* @return a map, containing variable names as keys; variables values as values*/ Map extractUriTemplateVariables(String pattern, String path); /*** Given a full path, returns a Comparator suitable for sorting patterns* in order of explicitness for that path.* The full algorithm used depends on the underlying implementation,* but generally, the returned Comparator will sort a list so that more * specific patterns come before generic patterns.* @param path the full path to use for comparison* @return a comparator capable of sorting patterns in order of explicitness*/ Comparator getPatternComparator(String path); /*** Combines two patterns into a new pattern that is returned.* The full algorithm used for combining the two pattern depends on the underlying implementation.* 合并两个模式。具体合并的算法由实现类决定。* @param pattern1 the first pattern* @param pattern2 the second pattern* @return the combination of the two patterns* @throws IllegalArgumentException when the two patterns cannot be combined*/ String combine(String pattern1, String pattern2); }
从接口代码来理解概念还是有些抽象,下面我们列举一些基于实现类AntPathMatcher的例子来增强理解 。
AntPathMatcher使用例子
AntPathMatcher antPathMatcher = new AntPathMatcher(); antPathMatcher.isPattern("/user/001"); // 返回 falseantPathMatcher.isPattern("/user/*"); // 返回 trueantPathMatcher.match("/user/001","/user/001"); // 返回 trueantPathMatcher.match("/user/*","/user/001"); // 返回 trueantPathMatcher.matchStart("/user/*","/user/001"); // 返回 trueantPathMatcher.matchStart("/user/*","/user"); // 返回 trueantPathMatcher.matchStart("/user/*","/user001"); // 返回 falseantPathMatcher.extractPathWithinPattern("uc/profile*","uc/profile.html"); // 返回 profile.htmlantPathMatcher.combine("uc/*.html","uc/profile.html"); // uc/profile.html
spring的路径匹配工具 AntPathMatcher 包路径:
org.springframework.util.AntPathMatcher
工具:
AntPathMatcher antPathMatcher = new AntPathMatcher();
以下代码为本人使用过的路径匹配工具代码
方便以后项目中使用参考:
//不需要鉴权的接口private Boolean excludePathFilter(String path) {PathProperties pathProperties = (PathProperties) PathProperties.applicationContext.getBean("pathProperties"); List excludePathPatterns = pathProperties.getExcludePathPatterns(); if(CollectionUtils.isEmpty(excludePathPatterns)){return false; }return excludePathPatterns.stream().anyMatch(pattern -> antPathMatcher.match(pattern, path)); }
核心代码是这一行
excludePathPatterns.stream().anyMatch(pattern -> antPathMatcher.match(pattern, path))
获取到需要排除鉴权接口列表的接口,然后通过 AntPathMatcher 的 match 方法去匹配路径,不需要做鉴权的接口就会被匹配到,然后继续执行非鉴权的业务流程。
【基于Spring概念模型:PathMatcher|基于Spring概念模型:PathMatcher 路径匹配器】以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 事件处理程序
- 阿菘的ScalersTalk第五轮新概念朗读持续力训练Day15|阿菘的ScalersTalk第五轮新概念朗读持续力训练Day15 20191025
- 基于爱,才会有“愿望”当“要求”。2017.8.12
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- HTML基础--基本概念--跟着李南江学编程