当前位置: 首页 > 面试题库 >

Servlet过滤器的执行顺序

颜鸿云
2023-03-14
问题内容

我偶然发现了我的Web应用程序中的一个错误,该错误使我head了一下头(并最终拔了头发),然后才发现发生了什么情况。

基本上,我在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过滤器。我的问题是,尽管encodingFilter应该在其他任何机会有机会读取之前将请求编码设置为UTF-8的事实,但我获得的表单数据并未解释为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的故障?是否在某处记录了文档,我应该提交错误报告吗?

我将Tomcat 7.0.39与Java 7配合使用。


问题答案:

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

根据规格

容器在构建要应用于特定请求URI的过滤器链时使用的顺序如下:

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



 类似资料:
  • 我在我的网络应用程序中偶然发现了一个错误,在我发现发生了什么之前,这个错误让我抓耳挠腮(最终扯了扯头发)。 基本上,我在我的网站上定义了两个过滤器。xml和两个类似的映射: 它们都是Spring MVC过滤器。我的问题是,我得到的表单数据没有被解释为UTF-8,尽管事实上编码过滤器应该在其他任何东西有机会从中读取之前将请求编码设置为UTF-8。 我最后注意到,表单方法过滤器在编码过滤器之前执行,尽

  • 不论是客户端,还是服务器,都可以添加多个过滤器。假设我们按照添加的顺序把它们叫做 filter1, filter2, … filterN。那幺它们的执行顺序是这样的。 在客户端的执行顺序 +------------------- OutputFilter -------------------+ | +-------+ +-------+ +-------

  • 问题内容: 我已经读过这个问题,我的一个同事让我感到怀疑: 在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果? 如果事先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用了筛选器,那么我将无法理解缓存的内容。 问题答案: 幸运的是,ES为您提供了两种类型的过滤器供您使用: 在第一种情况下,过滤器将应用于查询找到的所有文档。在第二种情况下,将在查询运行之前过滤

  • 我将在一个已经存在的网站中介绍Spring Web Security。现在出现了一个问题: 我希望我的自定义筛选器在Spring Security筛选器链之前在Tomcat筛选器链中执行。我不想让他们成为这个Spring安全过滤器链的一部分。 我所找到的只是Spring Boot中的一个解决方案(请参见“Spring-How to insert a filter before SpringSecu

  • 问题内容: 如果我们在WAR自己中定义特定于Webapp的servlet过滤器,则过滤器的执行顺序将与中定义的顺序相同。 但是,如果我们使用@WebFilter批注定义这些过滤器,那么过滤器的执行顺序是什么,如何确定执行顺序? 问题答案: 您确实不能使用注释定义过滤器执行顺序。但是,为了最大程度地减少使用量,仅用a注释所有过滤器就足够了,这样您就不需要定义,而只需按所需顺序定义即可。 例如, 与w

  • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。

  • Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。 Servlet 过滤器是可用于 Servlet