Java 过滤器Url通配符处理


原文链接:https://blog.csdn.net/washingtin/article/details/102976660

 今天遇到项目中,加过滤器调试麻烦的问题。加上了一个过滤器来处理每次登录的问题。

代码如下:

  1.   /**
  2.   * 将通配符表达式转化为正则表达式
  3.   *
  4.   * @param path
  5.   * @return
  6.   */
  7.   private String getRegPath(String path) {
  8.   char[] chars = path.toCharArray();
  9.   int len = chars.length;
  10.   StringBuilder sb = new StringBuilder();
  11.   boolean preX = false;
  12.   for (int i = 0; i < len; i++) {
  13.   if (chars[i] == '*') {//遇到*字符
  14.   if (preX) {//如果是第二次遇到*,则将**替换成.*
  15.   sb.append(".*");
  16.   preX = false;
  17.   } else if (i + 1 == len) {//如果是遇到单星,且单星是最后一个字符,则直接将*转成[^/]*
  18.   sb.append("[^/]*");
  19.   } else {//否则单星后面还有字符,则不做任何动作,下一把再做动作
  20.   preX = true;
  21.   continue;
  22.   }
  23.   } else {//遇到非*字符
  24.   if (preX) {//如果上一把是*,则先把上一把的*对应的[^/]*添进来
  25.   sb.append("[^/]*");
  26.   preX = false;
  27.   }
  28.   if (chars[i] == '?') {//接着判断当前字符是不是?,是的话替换成.
  29.   sb.append('.');
  30.   } else {//不是?的话,则就是普通字符,直接添进来
  31.   sb.append(chars[i]);
  32.   }
  33.   }
  34.   }
  35.   return sb.toString();
  36.   }
  37.    
  38.   /**
  39.   * 通配符模式
  40.   *
  41.   * @param excludePath - 不过滤地址
  42.   * @param reqUrl - 请求地址
  43.   * @return
  44.   */
  45.   private boolean filterUrls(String excludePath, String reqUrl) {
  46.   String regPath = getRegPath(excludePath);
  47.   return Pattern.compile(regPath).matcher(reqUrl).matches();
  48.   }
  49.    
  50.   /**
  51.   * 检验是否在非过滤地址
  52.   *
  53.   * @param excludeUrls
  54.   * @param reqUrl
  55.   * @return
  56.   */
  57.   private boolean checkWhiteList(String[] excludeUrls, String reqUrl) {
  58.   for (String url : excludeUrls) {
  59.   if (filterUrls(url, reqUrl)) {
  60.   return true;
  61.   }
  62.   }
  63.   return false;
  64.   }
  65.    

测试代码:

  1.   public static void main(String[] args) {
  2.   String[] excludeUrl = new String[]{"/abf/*","/abd/**","*.login","*.html","*.jsp","/abg/login"};
  3.    
  4.   System.out.println(checkWhiteList(excludeUrl, "/abf/test/login"));
  5.    
  6.   }