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

2022-09-02 09:01:03

我想知道使用配符或双通配符来描述servlet映射上的url模式有什么区别。

例如:下面有什么区别?

1)

<servlet-mapping id="...">
    <servlet-name>BuyServlet</servlet-name>
    <url-pattern>/buy/*</url-pattern>
</servlet-mapping>

2)

<servlet-mapping id="...">
    <servlet-name>ShopServlet</servlet-name>
    <url-pattern>/shop/**</url-pattern>
</servlet-mapping>

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

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

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

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


答案 1

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

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

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

所以我想第二个变体()没有意义。**

附言:我刚刚尝试设置这样的映射,似乎只有这个确切的URL才能匹配(Tomcat 6.0.32)。/shop/**


答案 2

Servlet 规范本身(V3.0,第 12.2 章)只定义了两种通配符映射:

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

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

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

严格遵循规范,您的第二个示例根本不是通配符模式,而应仅与“/shop/**”完全匹配。然而,大多数Servlet容器都不那么严格,允许在任意位置使用*通配符,或者提供更复杂的模式匹配选项。


推荐