基于Spring概念模型:PathMatcher 路径匹配器

 更新时间:2021年09月08日 10:37:08   作者:安迪源文  
这篇文章主要介绍了Spring概念模型:PathMatcher 路径匹配器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

源代码版本 : spring-webmvc-5.1.4.RELEASE

概述

PathMatcher是Spring的一个概念模型接口,该接口抽象建模了概念"路径匹配器",一个"路径匹配器"是一个用于路径匹配的工具。它的使用者是 :

org.springframework.core.io.support.PathMatchingResourcePatternResolver
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping
org.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 given  path 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<String, String> 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<String> 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");// 返回 false
antPathMatcher.isPattern("/user/*"); // 返回 true
antPathMatcher.match("/user/001","/user/001");// 返回 true
antPathMatcher.match("/user/*","/user/001");// 返回 true
antPathMatcher.matchStart("/user/*","/user/001"); // 返回 true
antPathMatcher.matchStart("/user/*","/user"); // 返回 true
antPathMatcher.matchStart("/user/*","/user001"); // 返回 false
antPathMatcher.extractPathWithinPattern("uc/profile*","uc/profile.html"); // 返回 profile.html
antPathMatcher.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<String> 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 方法去匹配路径,不需要做鉴权的接口就会被匹配到,然后继续执行非鉴权的业务流程。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决mybatis一对多关联查询多条数据只显示一条的问题

    解决mybatis一对多关联查询多条数据只显示一条的问题

    这篇文章主要介绍了解决mybatis一对多关联查询多条数据只显示一条的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java使用Cipher类实现加密的过程详解

    Java使用Cipher类实现加密的过程详解

    这篇文章主要介绍了Java使用Cipher类实现加密的过程详解,Cipher类提供了加密和解密的功能,创建密匙主要使用SecretKeySpec、KeyGenerator和KeyPairGenerator三个类来创建密匙。感兴趣可以了解一下
    2020-07-07
  • SpringBoot中application.properties与application.yml区别小结

    SpringBoot中application.properties与application.yml区别小结

    本文主要介绍了SpringBoot中application.properties与application.yml区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • Spring Boot+RabbitMQ 通过fanout模式实现消息接收功能(支持消费者多实例部署)

    Spring Boot+RabbitMQ 通过fanout模式实现消息接收功能(支持消费者多实例部署)

    这篇文章主要介绍了Spring Boot+RabbitMQ 通过fanout模式实现消息接收(支持消费者多实例部署),本文通过案例场景分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • RocketMQ根据Tag进行消息过滤

    RocketMQ根据Tag进行消息过滤

    消费者订阅了某个主题后,Apache RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息,可通过设置过滤条件在 Apache RocketMQ 服务端进行过滤,只获取到需要关注的消息子集,避免接收到大量无效的消息
    2023-02-02
  • Spring bean生命周期配置过程解析

    Spring bean生命周期配置过程解析

    这篇文章主要介绍了Spring bean生命周期配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spring实战之使用XML方式管理声明式事务操作示例

    Spring实战之使用XML方式管理声明式事务操作示例

    这篇文章主要介绍了Spring实战之使用XML方式管理声明式事务操作,结合实例形式详细分析了Spring XML方式管理声明式事务具体步骤、配置、接口及使用技巧,需要的朋友可以参考下
    2020-01-01
  • 如何自定义springboot-starter日志组件供各个服务使用(系统日志优化)

    如何自定义springboot-starter日志组件供各个服务使用(系统日志优化)

    文章介绍了如何将各个微服务的接口调用日志逻辑优化为一个可共享的Spring Boot Starter,通过自定义注解和自动装配机制实现,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Java经典排序算法之快速排序代码实例

    Java经典排序算法之快速排序代码实例

    这篇文章主要介绍了Java经典排序算法之快速排序代码实例,快速排序实现的思想是指通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,需要的朋友可以参考下
    2023-10-10
  • java easyUI实现自定义网格视图实例代码

    java easyUI实现自定义网格视图实例代码

    这篇文章主要给大家介绍了关于java easyUI实现自定义网格视图的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10

最新评论