diff --git a/src/main/java/com/alibaba/druid/util/ServletPathMatcher.java b/src/main/java/com/alibaba/druid/util/ServletPathMatcher.java index 3bd6090c3d..73dcedb9bb 100644 --- a/src/main/java/com/alibaba/druid/util/ServletPathMatcher.java +++ b/src/main/java/com/alibaba/druid/util/ServletPathMatcher.java @@ -17,45 +17,56 @@ package com.alibaba.druid.util; public class ServletPathMatcher implements PatternMatcher { private final static ServletPathMatcher instance = new ServletPathMatcher(); - + public static ServletPathMatcher getInstance() { return instance; } - /** - *

- * three type: endsWithMatch(eg. /xxx*=/xxx/xyz), startsWithMatch(eg. *.xxx=abc.xxx), equals(eg. /xxx=/xxx). - *

- * Notice: *xxx* will match *xxxyyyy. endsWithMatch first. - */ - @Override - public boolean matches(String pattern, String source) { - if (pattern == null || source == null) { - return false; - } - pattern = pattern.trim(); - source = source.trim(); - if (pattern.endsWith("*")) { - // pattern: /druid* source:/druid/index.html - int length = pattern.length() - 1; - if (source.length() >= length) { - if (pattern.substring(0, length).equals(source.substring(0, length))) { - return true; - } - } - } else if (pattern.startsWith("*")) { - // pattern: *.html source:/xx/xx.html - int length = pattern.length() - 1; - if (source.length() >= length && source.endsWith(pattern.substring(1))) { - return true; - } - } else { - // pattern: /druid/index.html source:/druid/index.html - if (pattern.equals(source)) { - return true; - } - } - return false; - } + /** + *

+ * three type: endsWithMatch(eg. /xxx*=/xxx/xyz), startsWithMatch(eg. + * *.xxx=abc.xxx), equals(eg. /xxx=/xxx). + *

+ * Notice: *xxx* will match *xxxyyyy. endsWithMatch first. + */ + @Override + public boolean matches(String pattern, String source) { + if (pattern == null || source == null) { + return false; + } + pattern = pattern.trim(); + source = source.trim(); + if (pattern.endsWith("*")) { + // pattern: /druid* source:/druid/index.html + int length = pattern.length() - 1; + if (source.length() >= length) { + if (pattern.substring(0, length).equals( + source.substring(0, length))) { + return true; + } + } + } else if (pattern.startsWith("*")) { + // pattern: *.html source:/xx/xx.html + int length = pattern.length() - 1; + if (source.length() >= length + && source.endsWith(pattern.substring(1))) { + return true; + } + } else if (pattern.contains("*")) { + // pattern: /druid/*/index.html source:/druid/admin/index.html + int start = pattern.indexOf("*"); + int end = pattern.lastIndexOf("*"); + if (source.startsWith(pattern.substring(0, start)) + && source.endsWith(pattern.substring(end + 1))) { + return true; + } + } else { + // pattern: /druid/index.html source:/druid/index.html + if (pattern.equals(source)) { + return true; + } + } + return false; + } }