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. * @param excludePath - 不过滤地址

  41. * @param reqUrl - 请求地址

  42. * @return

  43. */

  44. private boolean filterUrls(String excludePath, String reqUrl) {

  45. String regPath = getRegPath(excludePath);

  46. return Pattern.compile(regPath).matcher(reqUrl).matches();

  47. }

  48. /**

  49. * 检验是否在非过滤地址

  50. *

  51. * @param excludeUrls

  52. * @param reqUrl

  53. * @return

  54. */

  55. private boolean checkWhiteList(String[] excludeUrls, String reqUrl) {

  56. for (String url : excludeUrls) {

  57. if (filterUrls(url, reqUrl)) {

  58. return true;

  59. }

  60. }

  61. return false;

  62. }

测试代码:

  1. public static void main(String[] args) {

  2. String[] excludeUrl = new String[]{"/abf/*","/abd/**","*.login","*.html","*.jsp","/abg/login"};

  3. System.out.println(checkWhiteList(excludeUrl, "/abf/test/login"));

  4. }