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条规则:
-
?
匹配一个字符 -
*
匹配零个或多个字符 -
**
匹配path中的零个或多个“目录”