diff --git a/spring-core/src/main/java/org/springframework/util/AntPathMatcher.java b/spring-core/src/main/java/org/springframework/util/AntPathMatcher.java index 9afaf2532381..16acec178528 100644 --- a/spring-core/src/main/java/org/springframework/util/AntPathMatcher.java +++ b/spring-core/src/main/java/org/springframework/util/AntPathMatcher.java @@ -311,17 +311,12 @@ else if (!fullMatch && "**".equals(pattDirs[pattIdxStart])) { int strLength = (pathIdxEnd - pathIdxStart + 1); int foundIdx = -1; - strLoop: for (int i = 0; i <= strLength - patLength; i++) { - for (int j = 0; j < patLength; j++) { - String subPat = pattDirs[pattIdxStart + j + 1]; - String subStr = pathDirs[pathIdxStart + i + j]; - if (!matchStrings(subPat, subStr, uriTemplateVariables)) { - continue strLoop; - } + MatchContext context = new MatchContext(pattDirs, pathDirs, pattIdxStart, pathIdxStart, uriTemplateVariables ); + if(checkSubPatternMatch(context, i, patLength)){ + foundIdx = pathIdxStart + i; + break; } - foundIdx = pathIdxStart + i; - break; } if (foundIdx == -1) { @@ -341,6 +336,17 @@ else if (!fullMatch && "**".equals(pattDirs[pattIdxStart])) { return true; } + private boolean checkSubPatternMatch(MatchContext context, int i, int patLength) { + for (int j = 0; j < patLength; j++) { + String subPat = context.pattDirs[context.pattIdxStart + j + 1]; + String subStr = context.pathDirs[context.pathIdxStart + i + j]; + if (!matchStrings(subPat, subStr, context.uriTemplateVariables)) { + return false; + } + } + return true; + } + private boolean isPotentialMatch(String path, String[] pattDirs) { if (!this.trimTokens) { int pos = 0; @@ -638,6 +644,22 @@ public Comparator getPatternComparator(String path) { return new AntPatternComparator(path, this.pathSeparator); } + private static class MatchContext{ + String[] pattDirs; + String[] pathDirs; + int pattIdxStart; + int pathIdxStart; + @Nullable + Map uriTemplateVariables; + + MatchContext(String[] pattDirs, String[] pathDirs, int pattIdxStart, int pathIdxStart, @Nullable Map uriTemplateVariables) { + this.pattDirs = pattDirs; + this.pathDirs = pathDirs; + this.pattIdxStart = pattIdxStart; + this.pathIdxStart = pathIdxStart; + this.uriTemplateVariables = uriTemplateVariables; + } + } /** * Tests whether a string matches against a pattern via a {@link Pattern}.