java - web.xml 过滤器链序列

标签 java servlets servlet-filters

我需要帮助弄清楚为什么我的过滤器以这种方式链接 *.jsf 请求:

过滤器1->过滤器3->过滤器2

这样的 *.jsp 请求(所需的链):

过滤器1->过滤器2->过滤器3

<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>

最佳答案

最初的问题是由过滤器优先于 Faces servlet 引起的。尽管filter2 是一个过滤器,但它也与Faces Servlet 关联,因此在所有其他过滤器之后执行。为了解决这个问题,我将 Faces Servlet 与链中的最后一个过滤器 filter3 相关联。

通过以下映射,.jsp 和 .jsf 现在都按所需顺序执行: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>

关于java - web.xml 过滤器链序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23141776/

相关文章:

java - 具有同步块(synchronized block)的 Servlet init 方法

java - Spring Filter中的AbstractMethodError org.hibernate.ejb.HibernatePersistence.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;

java - 使用Java过滤器停止提交请求

java - 收款中断

java - 使用 Eclipse 调试时从 ServletRequest 获取 HTTP Post 数据

java - 如何在 Eclipse 中创建 servlet 过滤器?

spring-mvc - 简单的 Web 应用程序过滤器不过滤请求

java - 从 GoogleCredentials 获取 applicationDefault

java - Spark 蓄能器

java - Java 程序星期几