好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

源代码版本 : 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

查看更多关于基于Spring概念模型:PathMatcher 路径匹配器的详细内容...

  阅读:26次