gpt4 book ai didi

tomcat - Servlet 过滤器的执行顺序

转载 作者:行者123 更新时间:2023-11-28 21:43:54 25 4
gpt4 key购买 nike

我在我的 Web 应用程序中偶然发现了一个错误,在我发现发生了什么之前,我挠头(并最终拉扯我的头发)了一段时间。

基本上,我在我的 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。

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

The order of the filters in the chain is the same as the order that filter mappings appear in the web application deployment descriptor.

(来自 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 的一个小故障?它是否记录在某处,我应该提交错误报告吗?

我正在使用 Tomcat 7.0.39 和 Java 7。

最佳答案

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

根据specs

The order the container uses in building the chain of filters to be applied for a particular request URI is as follows:

  1. First, the <url-pattern> matching filter mappings in the same order that these elements appear in the deployment descriptor.
  2. Next, the <servlet-name> matching filter mappings in the same order that these elements appear in the deployment descriptor.

关于tomcat - Servlet 过滤器的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com