Question

I need help figure out why my filters are chained this way for *.jsf requests:

filter1->filter3->filter2

and this way for *.jsp requests (the desired chain):

filter1->filter2->filter3

<filter>
    <display-name>filter1</display-name>
    <filter-name>filter1</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
    <display-name>filter2</display-name>
    <filter-name>filter2</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter>
    <display-name>filter3</display-name>
    <filter-name>filter3</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>


<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>*.jsf</url-pattern>
    <url-pattern>*.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>  
<filter-mapping>
    <filter-name>filter2</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>      
    <url-pattern>*.jsp</url-pattern>    
</filter-mapping>
<filter-mapping>
    <filter-name>filter3</filter-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jsf</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
Was it helpful?

Solution

The original problem was caused by filters taking precedence over the Faces servlet. Despite filter2 being a filter, it was also associated with a Faces Servlet and as a result executed after all other filters. To counteract that, I associated Faces Servlet with the last filter of my chain, filter3.

With the following mapping both .jsp and .jsf now execute in desired sequence: filter1->filter2->filter3

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>*.jsf</url-pattern>
    <url-pattern>*.jsp</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>      
    <url-pattern>*.jsp</url-pattern>    
    <url-pattern>*.jsf</url-pattern>    
</filter-mapping>
<filter-mapping>
    <filter-name>filter3</filter-name>
    <url-pattern>*.jsp</url-pattern> <!-- only .jsp since .jsf will be picked up by faces servlet/filter combo -->
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping>  
<filter-mapping> <!-- this gets picked up last because of filter vs. servlet precedence, not because of position in web.xml -->
    <filter-name>filter3</filter-name> 
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top