AntPathMatcher 完成 Servlet path 通

2021-02-25  本文已影响0人  蓉漂里的小白

在我们实际项目中经常遇到url的模糊匹配和*号的通配,如果我们手写匹配规则代码量很大,也很复杂,今天就介绍一个springframework提供的工具类AntPathMatcher

1:背景

最近公司要二次开发一个认证授权项目,用于对公司内部的Saas服务进行认证和授权。
因为我们数据库中存储的接口地址有一部分是模糊地址(方便授权),例如:/a/, /b/x/
1:当我们对用户A授权/a/后,那么A用户就可以访问/a/b/c ,/a/d 既然:以/a/开头的所有地址。
2:当我们对用户A授权/a/
/c后,那么A用户就可以访问/a/b/c ,/a/d/c 但不能访问/a/b/d

2:实现

如果我们自己去手写这个代码工作量大,而且不稳定,其实springframework里已经给我们提供这样的类就是:AntPathMatcher ,核心就是这个类的match方法,完成url的模糊匹配和映射,下面就来演示一下使用方式:

  private static boolean checkUrlMatch(String url1, String url2) {
    AntPathMatcher antPathMatcher = new AntPathMatcher();
    if (Objects.equals(url1, url2) || url2.startsWith(url1) || antPathMatcher.match(url2, url1)) {
      return true;
    } else {
      return false;
    }
  }

url1就是目的地址,url2就是待匹配的地址,如果相等,或者url1可以匹配上url2就代表有权限,下面是测试用例

    String targetUrl = "/sib/*/c";

    AntPathMatcher antPathMatcher = new AntPathMatcher();
    boolean match1 = antPathMatcher.match(targetUrl, "/sib/a");
    boolean match2 = antPathMatcher.match(targetUrl, "/sib/a/c");
    boolean match3 = antPathMatcher.match(targetUrl, "/sib/a/b");
    System.out.println(match1);
    System.out.println(match2);
    System.out.println(match3);

输出结果:


image.png
上一篇下一篇

猜你喜欢

热点阅读