servletsservlet-filtersweb.xmlorder-of-execution

How to define servlet filter order of execution using annotations in WAR


If we define webapp specific servlet filters in WAR's own web.xml, then the order of execution of the filters will be the same as the order in which they are defined in the web.xml.

But, if we define those filters using @WebFilter annotation, what is the order of execution of filters, and how can we determine the order of execution?


Solution

  • You can indeed not define the filter execution order using @WebFilter annotation. However, to minimize the web.xml usage, it's sufficient to annotate all filters with just a filterName so that you don't need the <filter> definition, but just a <filter-mapping> definition in the desired order.

    For example,

    @WebFilter(filterName="filter1")
    public class Filter1 implements Filter {}
    
    @WebFilter(filterName="filter2")
    public class Filter2 implements Filter {}
    

    with in web.xml just this:

    <filter-mapping>
        <filter-name>filter1</filter-name>
        <url-pattern>/url1/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>filter2</filter-name>
        <url-pattern>/url2/*</url-pattern>
    </filter-mapping>
    

    If you'd like to keep the URL pattern in @WebFilter, then you can just do like so,

    @WebFilter(filterName="filter1", urlPatterns="/url1/*")
    public class Filter1 implements Filter {}
    
    @WebFilter(filterName="filter2", urlPatterns="/url2/*")
    public class Filter2 implements Filter {}
    

    but you should still keep the <url-pattern> in web.xml, because it's required as per XSD, although it can be empty:

    <filter-mapping>
        <filter-name>filter1</filter-name>
        <url-pattern />
    </filter-mapping>
    <filter-mapping>
        <filter-name>filter2</filter-name>
        <url-pattern />
    </filter-mapping>
    

    Regardless of the approach, this all will fail in Tomcat until version 7.0.28 because it chokes on presence of <filter-mapping> without <filter>. See also Using Tomcat, @WebFilter doesn't work with <filter-mapping> inside web.xml