Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Servlet filter url mapping

How can a filter be mapped to the root of a URL? I'm using Tomcat 7.0.2 and deploying an application as ROOT.war. The welcome page is sign_in.xhtml. I would like to run a filter whenever the client sends a request for the root of the site (i.e. the domain name only), or when the the client requests sign_in.xhtml. Here is what I have so far:

  <filter>
        <filter-name>My filter</filter-name>
        <filter-class>com.myApp.myFilter</filter-class>        
    </filter>
    <filter-mapping>
        <filter-name>My filter</filter-name>
        <url-pattern>/sign_in.xhtml</url-pattern>
    </filter-mapping>

Requests for sign_in.xhtml directly, successfully invoke the filter, but I'm not sure how to get requests for the root to invoke the filter. According to the Servlet spec (version 3.0)

<url-pattern>/</url-pattern>

maps to the default servlet, and an empty string maps to the root. Here's the relevant section from the spec:

"The empty string ("") is a special URL pattern that exactly maps to the application's context root, i.e., requests of the form http://host:port//. In this case the path info is ’/’ and the servlet path and context path is empty string (““)."

However, both of the following url patterns cause Tomcat to throw an exception.

<url-pattern></url-pattern>
<url-pattern>""</url-pattern>

I would really appreciate it if someone could shed some light on this. Thank You.

Andrew

like image 269
J. Andrew Laughlin Avatar asked Sep 10 '10 16:09

J. Andrew Laughlin


People also ask

What is URL pattern in filter 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.

How do you mapping a servlet to an URL pattern?

To map a URL to a servlet, you declare the servlet with the <servlet> element, then define a mapping from a URL path to a servlet declaration with the <servlet-mapping> element.

How do I exclude a URL from filter mapping?

The solution for excluding URLs from a third-party filter is to wrap it with a new custom filter which just adds the exclude functionality and delegates the filter logic to the wrapped class. // Forward the request to the next filter or servlet in the chain.

What is URL mapping in servlet?

What is servlet mapping? Servlet mapping specifies the web container of which java servlet should be invoked for a url given by client. It maps url patterns to servlets. When there is a request from a client, servlet container decides to which application it should forward to.


1 Answers

The <url-pattern>/</url-pattern> should work for requests on the root. Did you try it?

If your intent is more to filter all requests, then you should use <url-pattern>/*</url-pattern>.


Update: To exclude one and other, I tested the url-pattern of / at Tomcat 7 (using both web.xml and @WebFilter(urlPatterns={"/"})) and it indeed didn't work as expected. The url-pattern of / however works as expected on Tomcat 6 (Servlet 2.5) and also on Glassfish v3 (Servlet 3.0). I suspect a bug in Tomcat 7, so I've reported issue 49914 about this.

like image 190
BalusC Avatar answered Oct 12 '22 14:10

BalusC