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

目录
  • 概述
    • PathMatcher接口源代码
    • AntPathMatcher使用例子
  • spring的路径匹配工具 AntPathMatcher
    • 以下代码为本人使用过的路径匹配工具代码
    • 核心代码是这一行

源代码版本 : 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 方法去匹配路径,不需要做鉴权的接口就会被匹配到,然后继续执行非鉴权的业务流程。

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

(0)

相关推荐

  • 解决springmvc使用@PathVariable路径匹配问题

    一.问题 今天作毕设的时候,在搭建ssm框架的使用使用springmvc的@PathVariable时出现了一个路径匹配的问题,最后花了点时间解决了. 代码结构: 问题内容: 访问url为: 按照道理说,我应该到jsp的index页面去.最后的结果确实到了index页面,可是由于该页面引用了几个css和js,报异常找不到.有使用过spring经验的童鞋应该知道使用如下代码解决静态资源的访问. // 方法一 <mvc:default-servlet-handler/> // 方法二 <mv

  • SpringCloud实战小贴士之Zuul的路径匹配

    不论是使用传统路由的配置方式还是服务路由的配置方式,我们都需要为每个路由规则定义匹配表达式,也就是上面所说的 path 参数.在Zuul中,路由匹配的路径表达式采用了Ant风格定义. Ant风格的路径表达式使用起来非常简单,它一共有下面这三种通配符: 通配符 说明 ? 匹配任意的单个字符 * 匹配任意数量的字符 ** 匹配任意数量的字符,支持多级目录 我们可以通过下表的示例来进一步理解这三个通配符的含义并参考着来使用: URL路径 说明 /user-service/? 它可以匹配 /user-s

  • spring mvc路径匹配原则详解

    在Spring MVC中经常要用到拦截器,在配置需要要拦截的路径时经常用到<mvc:mapping/>子标签,其有一个path属性,它就是用来指定需要拦截的路径的.例如: <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.i360r.platform.webapp.runtime.view.interceptor.GenericInterceptor"

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

    目录 概述 PathMatcher接口源代码 AntPathMatcher使用例子 spring的路径匹配工具 AntPathMatcher 以下代码为本人使用过的路径匹配工具代码 核心代码是这一行 源代码版本 : spring-webmvc-5.1.4.RELEASE 概述 PathMatcher是Spring的一个概念模型接口,该接口抽象建模了概念"路径匹配器",一个"路径匹配器"是一个用于路径匹配的工具.它的使用者是 : org.springframework

  • Spring5路径匹配器PathPattern解析

    目录 Spring5路径匹配器PathPattern 1.PathPattern 只支持结尾部分使用 ** 2.PathPattern 支持使用例如 {*path} 路径匹配工具(AntPathMatcher vs PathPattern) Spring5路径匹配器PathPattern PathPattern 对url地址匹配的处理更加快速,它和AntPathMatcher 主要差异如下: 1.PathPattern 只支持结尾部分使用 ** 如果在路径的中间使用 ** 就会报错: @GetM

  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    一直想写这篇文章,前段时间痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams/quick4j 点击打开 源码地址:https://gi

  • 基于Spring MVC 简介及入门小例子(推荐)

    一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring MVC 提供了一个 DispatcherServlet 作为前端控制器来分配请求.通过策略接口,Spring 框架是高度可配置的.Spring MVC 还包含多种视图技术,如 Java Server Pages(JSP).Velocity.Tiles.iText 和 POI 等.Spring MV

  • 基于Spring Boot利用 ajax实现上传图片功能

    效果如下: 1.启动类中加入 SpringBoot重写addResourceHandlers映射文件路径 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/imctemp-rainy/**").addResourceLocations("file:D:/E/"); } 设置静态资源路径 2.   表单

  • 基于spring security实现登录注销功能过程解析

    这篇文章主要介绍了基于spring security实现登录注销功能过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependenc

  • 如何基于Spring使用工厂模式实现程序解耦

    这篇文章主要介绍了如何基于Spring使用工厂模式实现程序解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 啥是耦合.解耦? 既然是程序解耦,那我们必须要先知道啥是耦合,耦合简单来说就是程序的依赖关系,而依赖关系则主要包括 1. 类之间的依赖 2. 方法间的依赖 比如下面这段代码: public class A{ public int i; } public class B{ public void put(A a){ System.o

  • 基于spring三方包类注入容器的四种方式小结

    如果引用第三方jar包,肯定是不能直接使用常用注解@Controller.@Service.@Repository.@Component将类的实例注入到spring容器中.以下四种方法可以向spring容器中导入三方包中类实例 . 1 xml配置 这种情况大家用的比较多,就是在spring的xml文件中配置需要导入的bean.在springweb项目工程web.xml中 ContextLoaderListener或者DispatcherServlet的初始参数contextConfigLocat

  • 详解基于Spring Boot与Spring Data JPA的多数据源配置

    由于项目需要,最近研究了一下基于spring Boot与Spring Data JPA的多数据源配置问题.以下是传统的单数据源配置代码.这里使用的是Spring的Annotation在代码内部直接配置的方式,没有使用任何XML文件. @Configuration @EnableJpaRepositories(basePackages = "org.lyndon.repository") @EnableTransactionManagement @PropertySource("

  • 基于spring 方法级缓存的多种实现

    方案实施 1. spring和ehcache集成 主要获取ehcache作为操作ehcache的对象. spring.xml中注入ehcacheManager和ehCache对象,ehcacheManager是需要加载ehcache.xml配置信息,创建ehcache.xml中配置不同策略的cache. <!-- ehCache 配置管理器 --> <bean id="ehcacheManager" class="org.springframework.ca

随机推荐