返回顶部
首页 > 资讯 > 后端开发 > Python >使用Spring AntPathMatcher的doMatch方法
  • 105
分享到

使用Spring AntPathMatcher的doMatch方法

2024-04-02 19:04:59 105人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录AntPathMatcher的doMatch方法有4个步骤spring的AntPathMatcher工具类用法AntPathMatcher下面是模糊匹配规则AntPathMatc

AntPathMatcher的doMatch方法

AntPathMatcher.doMatch(...), 是解决模式匹配的源码

有4个步骤

1. 分解模式字符串, 分解路径字符串

2. 第一个while 循环, 用来判断绝对匹配 /xxx/abc ==> /xxx/abc

3. 第二个while循环两个字符串数组都从最后的下标开始匹配, 直到遇到pattDir为'**'时结束

4. 第三个while循环, 主要解决有多个'**'字符串.djdjdjd**/bc*.class等


// 解决模式匹配的函数, 返回true or false 表示是否匹配
// 参数 pattern: 表示模式字符串
	    path: 文件的路径
	protected boolean doMatch(String pattern, String path, boolean fullMatch, Map<String, String> uriTemplateVariables) {		
		if (path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
			return false;
		}
 
		1.1. 分解模式字符串
		String[] pattDirs = tokenizePattern(pattern);
		if (fullMatch && this.caseSensitive && !isPotentialMatch(path, pattDirs)) {
			return false;
		}
		
		1.2 分解路径字符串
		String[] pathDirs = tokenizePath(path);		
		// pattern的可分配下标 pattIdxStart ~ pattIdxEnd
		// path的可分配下标	pathIdxStart ~ pathIdxEnd
		int pattIdxStart = 0;
		int pattIdxEnd = pattDirs.length - 1;
		int pathIdxStart = 0;
		int pathIdxEnd = pathDirs.length - 1;
 
		// Match all elements up to the first **
		// 2. 第一个while 循环, 用来判断绝对匹配的   /xxx/abc ==> /xxx/abc
		// 两个字符串都从下标0开始, 直到模式字符串遇到**结束
		while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {
			String pattDir = pattDirs[pattIdxStart];
			if ("**".equals(pattDir)) {
				break;
			}
			if (!matchStrings(pattDir, pathDirs[pathIdxStart], uriTemplateVariables)) {
				return false;
			}
			pattIdxStart++;
			pathIdxStart++;
		}
 
		// pathIdxStart > pathIdEnd, 表示文件路径(path), 已经逐一的匹配到了
		if (pathIdxStart > pathIdxEnd) {
			
			
			// 这里返回true 一般是相等的字符串匹配(长度相同)
			// /abc/zzzz ==> /abc/zzzz
			return true;
		}
		
		
		
		// 3. 两个字符串数组都从最后的下标开始匹配, 直到遇到pattDir为'**'时结束
		while (pattIdxStart <= pattIdxEnd && pathIdxStart <= pathIdxEnd) {
			String pattDir = pattDirs[pattIdxEnd];
			if (pattDir.equals("**")) {
				break;
			}
			if (!matchStrings(pattDir, pathDirs[pathIdxEnd], uriTemplateVariables)) {
				return false;
			}
			pattIdxEnd--;
			pathIdxEnd--;
		}
		if (pathIdxStart > pathIdxEnd) {
			for (int i = pattIdxStart; i <= pattIdxEnd; i++) {
				if (!pattDirs[i].equals("**")) {
					return false;
				}
			}
			// 这里返回true 一般字符串为 
			// /xxxx/abcd*.class => /xxxx/abcd /xxx.class 
			// 即只有一个**, 而且**没发挥到什么作用 
			// 测试
			// AntPathMatcher ant = new AntPathMatcher("/");
			//String pattern = "/abc*.class";
			//String path = "/abc/DDD.class";
			//System.out.println(ant.match(pattern, path));
			return true;
		}
 
		// 4. 第3个while循环, 主要解决有多个'**'字符串.	djdjdjd**/bc*.class等
		// 每次下标又从pattIdxStart+1开始
		while (pattIdxStart != pattIdxEnd && pathIdxStart <= pathIdxEnd) {
			int patIdxTmp = -1;	// 这个用来指向**的位置
			for (int i = pattIdxStart + 1; i <= pattIdxEnd; i++) {
				if (pattDirs[i].equals("**")) {
					patIdxTmp = i;
					break;
				}
			}
			if (patIdxTmp == pattIdxStart + 1) {
				// '****就跳过, 因为这没有意义, 一个a/ba/ba/ba/ba/ba/ba/ba/b
 public AntPathMatcher(String pathSeparator) {
  Assert.notNull(pathSeparator, "'pathSeparator' is required");
  this.pathSeparator = pathSeparator;
  this.pathSeparatorPatternCache = new PathSeparatorPatternCache(pathSeparator);
 }

public boolean hasUrl(String url) {
    if (url == null || "".equals(url)) {
    return false;
}
 
AntPathMatcher antPathMatcher = new AntPathMatcher();
// 可根据需求做动态匹配
String pattern = "/appexample
            匹配(Matches) /app/example, /app/foo/example, 和 /example
        
        
            /appdir/file.
            匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java
        
        
            *.jsp
            匹配(Matches)任何的.jsp 文件
        
    

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

--结束END--

本文标题: 使用Spring AntPathMatcher的doMatch方法

本文链接: https://lsjlt.com/news/135029.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Spring AntPathMatcher的doMatch方法
    目录AntPathMatcher的doMatch方法有4个步骤Spring的AntPathMatcher工具类用法AntPathMatcher下面是模糊匹配规则AntPathMatc...
    99+
    2024-04-02
  • 【Spring】JdbcTemplate的使用方法
    JdbcTemplate(概念和准备) 什么是 JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 准备工作 引入相关 jar 包 在 spring 配置文件配...
    99+
    2018-06-11
    【Spring】JdbcTemplate的使用方法 数据库入门 数据库基础教程 数据库 mysql
  • spring中redis的使用方法
    这篇文章将为大家详细讲解有关spring中redis的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。spring中redis怎么用在Spring中使用RedisJ...
    99+
    2024-04-02
  • Spring中getSingleton的使用方法
    本篇内容主要讲解“Spring中getSingleton的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中getSingleton的使用方法”吧!Spring中bean的生命...
    99+
    2023-06-20
  • Spring Boot 集成PageHelper的使用方法
    目录前言:一、基本集成引入jar包Yml配置文件中添加相关配置封装相关分页方法示例代码前段传入参数执行结果二、分页中的排序字段如何防止SQL注入问题三、复杂的SQL分页语句四、分页失...
    99+
    2024-04-02
  • mybatis spring配置SqlSessionTemplate的使用方法
    这篇文章主要讲解了“mybatis spring配置SqlSessionTemplate的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mybatis spring配置SqlSess...
    99+
    2023-06-20
  • Spring使用注解开发的方法
    这篇文章主要介绍了Spring使用注解开发的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring使用注解开发的方法文章都会有所收获,下面我们一起来看看吧。在Spring4之后 要使用注解开发 必须保证...
    99+
    2023-06-30
  • Spring中ApplicationContextAware的使用方法详解
    ApplicationContextAware 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicat...
    99+
    2023-03-22
    Spring中ApplicationContextAware作用 Spring ApplicationContextAware
  • Spring中的使用@Async异步调用方法
    目录使用@Async异步调用方法Async简介给Spring的TaskExecutor去完成本次记录Async使用场景异步请求与异步调用的区别异步请求的实现SpringBoot中异步...
    99+
    2024-04-02
  • Spring Cloud微服务使用webSocket的方法
    webSocket webSocket长连接是一种在单个tcp连接上进行全双工通信的协议,允许双向数据推送。一般微服务提供的restful API只是对前端请求做出相应。使用web...
    99+
    2024-04-02
  • spring使用JavaConfig进行配置的方法
    JavaConfig,是在 Spring 3.0 开始从一个独立的项目并入到 Spring 中的。JavaConfig 可以看成一个用于完成 Bean 装配的 Spring 配置文件...
    99+
    2024-04-02
  • 使用Spring方法拦截器MethodInterceptor
    目录Spring方法拦截器MethodInterceptor前言Spring拦截器实现+后台原理(MethodInterceptor)MethodInterceptorMethodI...
    99+
    2024-04-02
  • spring @Primary-在spring中的使用方式
    spring @Primary在spring的使用 在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的。但有些特殊情况,对同一个接口,可能会...
    99+
    2024-04-02
  • Spring Boot中使用Spring Retry重试框架的操作方法
    目录Spring Retry 在SpringBoot 中的应用Maven依赖注解使用开启Retry功能注解@Retryable注解@Recover注解@CircuitBreakerR...
    99+
    2024-04-02
  • Spring中@Scheduled功能的使用方法详解
    目录前言一、Spring @Scheduled Annotation1.2 如何启用@Scheduled 注释1.3 使用@Scheduled 注释二、固定的延时和频率使用@Sche...
    99+
    2024-04-02
  • Spring Cloud Feign使用对象参数的方法
    本文小编为大家详细介绍“Spring Cloud Feign使用对象参数的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Cloud Feign使用对象参数的方法”文章能帮助大家解决...
    99+
    2023-06-29
  • @ModelAttribute注解在spring mvc中的使用方法
    @ModelAttribute注解在spring mvc中的使用方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在spring mvc中非常重要的注解@Mod...
    99+
    2023-05-31
    springmvc @modelattribute
  • spring 操作elasticsearch查询使用方法
    最近学习了一下elasticsearch使用,网上的资料又很少,真是一个头两个大。好歹最后终于了解了。留个笔记做日后查询。package com.gooddeep.dev.elasticsearch.commons.dao; import...
    99+
    2023-05-31
    spring elasticsearch
  • RedisTemplate方法如何在spring中使用
    本篇文章给大家分享的是有关RedisTemplate方法如何在spring中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需要的jar包 spring-data-Redis...
    99+
    2023-05-31
    spring redistemplate emp
  • spring项目中切面及AOP的使用方法
    使用AOP的原因(AOP简介) 我们知道,spring两大核心,IOC(控制反转)和AOP(切面),那为什么要使用AOP,AOP是什么呢,严格来说,AOP是一种编程规范,是一种编程思...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作