在我发现发生了什么之前,我偶然发现了我的 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。
我终于注意到表单方法过滤器是在编码过滤器之前执行的,尽管定义过滤器映射的顺序应该是它们链接的顺序:
过滤器在链中的顺序与过滤器映射出现在 Web 应用程序部署描述符中的顺序相同。
(来自甲骨文)
当我使用相同的映射,即映射到 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。