Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the double wildcard (*) on a servlet mapping url-pattern mean?

I'm wondering what is the difference of using a single or double wildcards to describe a url-pattern on a servlet mapping.

For example: what is the difference below?

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>

EDIT: @Andrew is right, the specification talks about only one wildcard (*).

I double checked my code and noticed that the place where I found double wildcards (**) was in a Spring SimpleUrlHandlerMapping bean.

In that case, it makes sense. As per the class doc, it uses AntPathMatcher, which states:

The mapping matches URLs using the following rules: ? matches one character * matches zero or more characters ** matches zero or more 'directories' in a path

like image 243
fegemo Avatar asked Dec 12 '12 15:12

fegemo


People also ask

What is URL pattern in servlet mapping?

The url-pattern element of a servlet-mapping or a filter-mapping associates a filter or servlet with a set of URLs. When a request arrives, the container uses a simple procedure for matching the URL in the request with a url-pattern in the web. xml file. Section 4.7.

What does URL pattern mean?

A URL pattern is a set of ordered characters to which the Google Search Appliance matches actual URLs that the crawler discovers. You can specify URL patterns for which your index should include matching URLs and URL patterns for which your index should exclude matching URLs.


3 Answers

Section 11.2 of servlet specification (version 2.5) states the following:

In the Web application deployment descriptor, the following syntax is used to define mappings:

  • A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping.
  • A string beginning with a ‘*.’ prefix is used as an extension mapping.
  • A string containing only the ’/’ character indicates the "default" servlet of the application. In this case the servlet path is the request URI minus the context path and the path info is null.
  • All other strings are used for exact matches only.

So I guess the second variant (**) doesn't make sense.

P.S. I've just tried to set up such mapping and it seems that only this exact url /shop/** will be matched (Tomcat 6.0.32).

like image 90
Andrew Logvinov Avatar answered Nov 02 '22 16:11

Andrew Logvinov


The Servlet specification itself (Version 3.0, Chapter 12.2) defines only two kinds of wildcard mapping:

  • If the URL pattern ends with "/*", it matches all requests to the preceding path.
  • If the URL pattern starts with "*.", it matches all requests to any resource ending with the following extension.

E.g. "/foo/*" will match all requests for URLs starting with "http://server/context/foo/" and "*.jsp" will match all requests for URL ending with ".jsp".

Following the specification, the empty string ("") and a single slash ("/") have specific meanings. "All other strings are used for exact matches only."

Following the specification strictly, your second example is not a wildcard pattern at all, but should only match "/shop/**" exactly. Most Servlet containers are however less strict and allow using the * wildcard at arbitrary locations or offer even more complex pattern matching options.

like image 31
jarnbjo Avatar answered Nov 02 '22 17:11

jarnbjo


No where in specification talking about second case.

As per servlet specification 12.2

A string beginning with a ‘/’ character and ending with a ‘/*’ suffix is used for path mapping

All other strings are used for exact matches only.

As per specification second would be considered for exact match only. It may vary based on server providers.

like image 4
kosa Avatar answered Nov 02 '22 15:11

kosa