servlet映射url-pattern上的双通配符(*)是什么意思?

我想知道使用单个双通配符来描述servlet映射上的url模式有什么不同。

例如:下面有什么区别?

1)

 BuyServlet /buy/*  

2)

  ShopServlet /shop/**  

编辑:@Andrew是对的,规范只讨论一个通配符(*)。

我仔细检查了我的代码并注意到我找到双通配符(**)的地方是在Spring SimpleUrlHandlerMapping bean中。

在这种情况下,它是有道理的。 根据类doc ,它使用AntPathMatcher ,它指出:

映射使用以下规则匹配URL: 匹配一个字符*匹配零个或多个字符**匹配路径中的零个或多个“目录”

servlet规范(版本2.5)的第11.2节声明如下:

在Web应用程序部署描述符中,以下语法用于定义映射:

  • 以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射。
  • 以“*”开头的字符串 prefix用作扩展映射。
  • 仅包含’/’字符的字符串表示应用程序的“默认”servlet。 在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null。
  • 所有其他字符串仅用于完全匹配。

所以我猜第二个变种( ** )没有意义。

PS我刚刚尝试设置这样的映射,似乎只有这个精确的url /shop/**才能匹配(Tomcat 6.0.32)。

Servlet规范本身(版本3.0,第12.2章)仅定义了两种通配符映射:

  • 如果URL模式以“/ *”结尾,则它匹配对前一路径的所有请求。
  • 如果URL模式以“*。”开头,则它匹配对以任何以下扩展名结尾的资源的所有请求。

例如,“/ foo / ”将匹配以“http:// server / context / foo /”开头的所有URL请求,“。 jsp”将匹配以“.jsp”结尾的所有URL请求。

遵循规范,空字符串(“”)和单个斜杠(“/”)具有特定含义。 “所有其他字符串仅用于完全匹配。”

严格遵循规范,你的第二个例子根本不是通配符模式,但应该只匹配“/ shop / **”。 但是,大多数Servlet容器都不太严格,允许在任意位置使用*通配符或提供更复杂的模式匹配选项。

没有在规范中讨论第二种情况。

根据servlet规范12.2

以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射

 All other strings are used for exact matches only. 

根据规格,第二次仅考虑完全匹配。 它可能因服务器提供商而异。