Spring:关于path的/ **和/ *的区别

当我们引用path时,两个星号之间的区别是什么,而不是一个星号?

早些时候我正在debugging我的Spring 3项目。 我试图添加一个.swf使用

<spring:url var="flashy" value="/resourceshttp://img.dovov.comflash.swf"/>

用我的web.xml的ResourceServlet看起来像

 <servlet-name>Resource Servlet </servlet-name> <url-pattern>/resources/*</url-pattern> 

但不幸的是我得到这个错误:

WARN org.springframework.js.resources.ResourceServlet - An attempt to access a protected resource at http://img.dovov.comflash.swf was disallowed.

我发现它真的很奇怪,因为我的images文件夹中的所有图片都被访问过,但是我的.swf怎么被“保护”?

之后,我决定将/resources/*更改为/resources/** ,最后运行。 我的问题是…为什么?

  • 星号('*')匹配零个或多个字符,直到出现'/'字符(用作path分隔符)。 一个string,例如"/abcd/docs/index.html" ,不能匹配模式'/\*/\*.index.html' 。 第一个星号仅匹配第一个path分隔符,导致"abcd"string。 一个成功的匹配模式将是'/\*/\*/\*.html'
  • 包含两个星号('\*\*')的string匹配零个或多个字符。 这可能包括path分隔符'/' 。 在这种情况下, "/abcd/docs/index.html"将成功匹配'/\*\*/\*.html'模式。 双星号(包括path分隔符)将匹配“abcd / docs”string。

希望有所帮助!

这是Apache ant中使用的path模式,Spring团队在整个框架中实现它并使用它。

作为参考,请参阅AntPathMatcher的 javadoc( 最新的 javadoc似乎有问题,所以我链接一个旧的)。

回到你的问题,根据文件,它只有3条规则:

  1. ? 匹配一个字符
  2. *匹配零个或多个字符
  3. **匹配path中的零个或多个“目录”