Spring AntPathMatcher ведет себя по-разному, когда шаблон последнего символа равен '/' - PullRequest
0 голосов
/ 27 июня 2018

Используемая мной версия пружины - 4.3.7-SNAPSHOT, а разделитель пути по умолчанию - /

Я обнаружил, что когда последний символ строки паттерна равен ' / ', а последний символ строки пути НЕ равен ' / ', AntPathMatcher ведет себя по-другому, см. Код ниже

public class AntPathMatcher4SpringTest {

private AntPathMatcher matcher = new AntPathMatcher();

@Test
public void test1() {     
    String patter1 = "/com/abc/def/x.html/";
    String patter2 = "/com/**/abc/def/x.html/";
    String path1 = "/com/abc/def/x.html/";
    String path2 = "/com/abc/def/x.html";

    assertTrue(matcher.match(patter1, path1));
    assertTrue(matcher.match(patter2, path1));
    assertFalse(matcher.match(patter1, path2));
    assertTrue(matcher.match(patter2, path2));
  }
}

while, последний символ patter1 и patter2 - это ' / ', а последний символ path1 также равен ' / ', но path2 нет.

путь1 может соответствовать как patter1, так и patter2 но path2 только математика patter2, а не patter1, почему?

1 Ответ

0 голосов
/ 27 июня 2018

Ну, вы сделали очень хорошую мысль. Так оно и есть (Вот так оно и задумано).

Но, может быть, я могу дать некоторые внутренние детали. Это то, что я нашел после отладки AntPathMatcher::match.

Причина, по которой matcher.match(patter1, path2) является ложным ===> / считается разделителем пути по умолчанию. Так что метод match делает внутренне, чтобы разделить его, используя / в качестве разделителя, и посмотреть, совпадают ли все токены. Но, в конце концов, есть строка сравнения, подобная этой

return (pattern.endsWith(this.pathSeparator) == path.endsWith(this.pathSeparator));  

Который в основном проверяет, заканчивается ли и шаблон, и путь / или нет. Следовательно, вы становитесь ложными.

Причина, по которой matcher.match(patter2, path2) является верным ===> Что ж, все становится сложно, когда используется подстановочный знак **. Если используется подстановочный знак, то логика такова, что изначально токены сопоставляются до **. После обнаружения он проверяет токены с последнего до последнего появления **. В этом случае нет проверки на трейлинг /. Это главная причина, по которой это работает.

Может быть, это ошибка. Так что причина этого случая в том, что подстановочный знак.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...