【问题标题】:Spring DelegatingFilterProxy execution order issueSpring DelegatingFilterProxy 执行顺序问题
【发布时间】:2015-12-22 09:50:01
【问题描述】:

我有以下方式定义的 web.xml

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

  <filter-mapping>
   <filter-name>Filter1</filter-name>
   <url-pattern>*.do</url-pattern>
  </filter-mapping>



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

  <filter-mapping>
   <filter-name>Filter2</filter-name>
   <url-pattern>/filter2.do</url-pattern>
  </filter-mapping>


  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:filter1-beans-def.xml
            classpath:filter2-bean-def.xml
        </param-value>
    </context-param>

      //dispatcher Servlet defination

从上面的序列过滤器1定义首先出现,然后是第二个过滤器。在上下文中定义其各自的 bean 的情况也是如此。

但实际上我的过滤器是按以下顺序执行的:filter 2 ---> filter 1。 我想以相反的顺序执行它们吗?

这里发生了什么问题?谢谢

【问题讨论】:

  • 它与spring无关,也与spring-mvc无关。由于您的过滤器是在 web.xml 文件中定义的,因此它由 servlet 容器处理,并且规范要求容器应用 匹配过滤器映射的顺序与这些元素在部署描述符中出现的顺序相同。您如何确定订单?
  • 是的,因为我已经设置了调试点
  • 你的servlet容器是什么?看起来它不遵守规范......
  • 你把调试点放在哪里了?您确定正在使用DelegatingFilterProxy 吗?您的过滤器没有,通过任何更改 @WebFilter 注释?或者在ServletContainerInitializerWebApplicationInitializer 的某个地方有一个web-fragment.xml 正在搞乱过滤器?所以请添加您的完整 web.xml 和您的实际过滤器(至少带有注释的类定义)。

标签: java spring spring-mvc servlet-filters


【解决方案1】:

根据我阅读的所有文档,过滤器应该按照过滤器映射元素的定义顺序执行。

How do web.xml filters work? Can you have two filters map to all pages (/*) and specify the order?

过滤器被调用的顺序是 匹配 servlet 的请求 URI 的过滤器映射声明 出现在过滤器映射元素列表中

http://docs.oracle.com/javaee/6/tutorial/doc/bnagb.html

过滤器在链中的顺序与链中的顺序相同 哪些过滤器映射出现在 Web 应用程序部署中 描述符。

要尝试的一件事是重新排列过滤器和过滤器映射元素以组合在一起:

<filter>
   <filter-name>Filter1</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
   <filter-name>Filter2</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>Filter1</filter-name>
   <url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
   <filter-name>Filter2</filter-name>
   <url-pattern>/filter2.do</url-pattern>
</filter-mapping>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多