Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 当pattern last char为'/';_Spring_Spring Mvc - Fatal编程技术网

Spring 当pattern last char为'/';

Spring 当pattern last char为'/';,spring,spring-mvc,Spring,Spring Mvc,我使用的spring版本是4.3.7-SNAPSHOT,默认路径分隔符是/ 我发现当模式字符串last char为“/”而路径字符串last char不是“/”时,AntPathMatcher的行为不同,请参见下面的代码 public class AntPathMatcher4SpringTest { private AntPathMatcher matcher = new AntPathMatcher(); @Test public void test1() { Stri

我使用的spring版本是4.3.7-SNAPSHOT,默认路径分隔符是/

我发现当模式字符串last char为“/”而路径字符串last char不是“/”时,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));
  }
}
然而,patter1和patter2最后一个字符都是“/”,path1最后一个字符也是“/”,但path2不是

path1可以同时匹配patter1和patter2
但是路径2只是数学模式2,而不是模式1,为什么呢?

好吧,你说得很好。这就是它的设计方式

但也许我可以提供一些内部细节。这是我调试
AntPathMatcher::match
后发现的

原因
matcher.match(patter1,path2)
为false
==>
/
被视为默认路径分隔符。所以,
match
方法在内部所做的是使用
/
作为分隔符来分割它,并查看是否所有标记都匹配。但最终会有这样一条比较线

return (pattern.endsWith(this.pathSeparator) == path.endsWith(this.pathSeparator));  
这基本上是检查模式和路径是否以
/
结尾。因此,你正在变得虚假

为什么
matcher.match(patter2,path2)
是正确的
==>当涉及通配符时,事情会变得棘手。如果涉及通配符,则逻辑是这样的:最初,标记将被匹配,直到遇到
**
。一旦找到,它将检查从最后一次到最后一次出现
**
的令牌。在这种情况下,不检查尾随
/
。这是这项工作成功的主要原因


可能是一只虫子。所以这个案例之所以有效是因为通配符。

谢谢您的回答。因此matcher.match(patter2,path2)为true,因为它没有检查两个字符串是否以相同的路径分隔符结尾,而matcher.match(patter1,path2)检查时涉及了通配符**。但我不明白为什么它没有像我在上一份声明中说的那样在这种情况下检查。可能是一只虫子。