【问题标题】:Servlet filters' order of executionServlet 过滤器的执行顺序
【发布时间】:2013-06-09 19:37:19
【问题描述】:

我偶然发现了我的网络应用程序中的一个错误,在我发现发生了什么之前,我一直摸不着头脑(并最终拉扯我的头发)。

基本上,我在 web.xml 中定义了 2 个过滤器,两个映射如下:

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>SpringFormMethodFilter</filter-name>
    <url-pattern>/administration/*</url-pattern>
</filter-mapping>

它们都是 Spring MVC 过滤器。我的问题是我得到的表单数据没有被解释为 UTF-8,尽管 encodingFilter 应该在其他任何东西有机会从中读取之前将请求编码设置为 UTF-8。

我终于注意到表单方法过滤器是在编码过滤器之前执行的,尽管定义过滤器映射的顺序应该是它们链接的顺序:

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

(来自Oracle

当我使用相同的映射(即映射到 servlet 而不是 URL 模式)时,两种映射的顺序都会恢复并且一切都按预期工作:

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

<filter-mapping>
    <filter-name>SpringFormMethodFilter</filter-name>
    <servlet-name>SpringMVCDispatcher</servlet-name>
</filter-mapping>

这是Servlet 规范的一部分,还是Tomcat 的故障?它是否记录在某处,我应该提交错误报告吗?

我正在使用带有 Java 7 的 Tomcat 7.0.39。

【问题讨论】:

    标签: tomcat servlets tomcat7 servlet-filters


    【解决方案1】:

    当容器接收到一个请求时,它首先会找到所有带有与请求 URI 匹配的&lt;url-pattern&gt; 的过滤器映射。这将成为过滤器链中的第一组过滤器。接下来,它会找到与请求 URI 匹配的 &lt;servlet-name&gt; 的所有过滤器映射。这成为过滤器链中的第二组过滤器。在这两个组中,过滤器都按照它们在部署描述符(D.D.)中声明的顺序执行

    根据specs

    容器在构建过滤器链时使用的顺序 具体请求URI如下:

    1. 首先,&lt;url-pattern&gt; 匹配过滤器映射的顺序与这些 元素出现在部署描述符中。
    2. 接下来,&lt;servlet-name&gt; 匹配过滤器映射的顺序与这些 元素出现在部署描述符中。

    【讨论】:

    • D.D.是什么意思?
    • @PeterRader 部署描述符:web.xml
    【解决方案2】:

    此外,您可以定义过滤器的应用顺序。这可以通过在 web.xml 中添加以下行来完成:

    <absolute-ordering>
      <name>encodingFilter</name>
      <name>SpringFormMethodFilter</name>
    </absolute-ordering>
    

    查看this了解更多信息。

    【讨论】:

    • 这是绝对错误的,外部标签是用于片段而不是过滤器
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2013-11-27
    • 2014-04-22
    • 2011-09-27
    • 2020-07-10
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多