一、介绍
1、简介
路径在很多地方都会使用,比如:文件名,URL地址等,JDK
提供了 Path
类用来表示路径。实际使用时,经常需要通过一个路径表示多个地址,比如,Spring
启动时的扫描路径,这就需要增加对通配符的支持,同时也就需要支持对通配符的匹配。
Spring 设计了 PathMatcher 路径匹配器接口,用于支持带通配符的资源路径匹配。这个接口在 Spring 的多个地方得到应用,比如:
PathMatchingResourcePatternResolver:资源扫描,启动时扫描并加载资源
AbstractUrlHandlerMapping:请求路径映射到 Controller
WebContentInterceptor:拦截器拦截路径分析
2、匹配规则
Spring
为 PathMatcher
接口提供了一个默认实现 AntPathMatcher
,支持 Ant 风格的路径匹配
匹配符 | 描述 |
---|---|
? | 匹配一个字符 |
* | 匹配多个字符 |
** | 匹配多层路径 |
另外,AntPathMatcher
还支持 {}
进行参数匹配
antPathMatcher.match("/root/aaa","/root/aaa"); // true
antPathMatcher.match("/root/*", "/root/aaa"); // true
// true,都以 / 结束
antPathMatcher.match("/root/*/", "/root/aaa/");// true
// false,结束符不一致
antPathMatcher.match("/root/*", "/root/aaa/"); // false
// true,/ 匹配 /*
antPathMatcher.match("/root/aaa/*", "/root/aaa/"); // true
// true,/ 匹配 /**
antPathMatcher.match("/root/aaa/**", "/root/aaa/"); // trueantPathMatcher.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
3、demo
public class UrlConstants {public static final String WEB_API_PRE = "/v1/**";public static final String OPEN_API_PRE = "/openApi/**";public static final List<AntPathRequestMatcher> WEB_MATCHERS = List.of(new AntPathRequestMatcher(WEB_API_PRE));public static final List<AntPathRequestMatcher> OPEN_API_MATCHERS =List.of(new AntPathRequestMatcher(OPEN_API_PRE));
}
public static boolean urlMatches(HttpServletRequest request, List<AntPathRequestMatcher> matchers) {Optional<AntPathRequestMatcher> first = matchers.stream().filter(m -> m.matches(request)).findFirst();return first.isPresent();}