源代碼版本 : spring-webmvc-5.1.4.RELEASE
概述
PathMatcher是Spring的一個概念模型接口,該接口抽象建模了概念"路徑匹配器",一個"路徑匹配器"是一個用于路徑匹配的工具。它的使用者是 :
1
2
3
|
org.springframework.core.io.support.PathMatchingResourcePatternResolver org.springframework.web.servlet.handler.AbstractUrlHandlerMapping org.springframework.web.servlet.mvc.WebContentInterceptor |
Spring框架自身對概念模型接口也提供了一個缺省的實現AntPathMatcher,用于匹配Ant風格的路徑。
PathMatcher接口源代碼
PathMatcher接口源代碼如下 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
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使用例子
1
2
3
4
5
6
7
8
9
10
|
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
包路徑:
1
|
org.springframework.util.AntPathMatcher |
工具:
1
|
AntPathMatcher antPathMatcher = new AntPathMatcher(); |
以下代碼為本人使用過的路徑匹配工具代碼
方便以后項目中使用參考:
1
2
3
4
5
6
7
8
9
|
//不需要鑒權的接口 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)); } |
核心代碼是這一行
1
|
excludePathPatterns.stream().anyMatch(pattern -> antPathMatcher.match(pattern, path)) |
獲取到需要排除鑒權接口列表的接口,然后通過 AntPathMatcher 的 match 方法去匹配路徑,不需要做鑒權的接口就會被匹配到,然后繼續執行非鑒權的業務流程。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://andyboke.blog.csdn.net/article/details/88884286