当前位置: 首页 > 知识库问答 >
问题:

过滤器链调用是如何工作的?

万俟玉书
2023-03-14

我试图理解过滤器链接。正如这个问题所定义的

所有过滤器都被链接(按照它们在web.xml中定义的顺序)。chain.doFilter()正在进行到链中的下一个元素。链的最后一个元素是目标资源/servlet。

我很想知道容器中的场景背后,容器是如何处理过滤器链接的。有人能解释一下过滤器链接是如何在容器内处理的吗?

共有1个答案

岑驰
2023-03-14

每个过滤器实现javax。servlet。Filter接口,它包括一个doFilter()方法,该方法将请求响应对以及一个过滤器链,过滤器链是实现javax的类(由servlet容器提供)的实例。servlet。过滤链接口。过滤器链反映过滤器的顺序<代码>servlet容器,基于web中的配置顺序。xml文件,为任何servlet或其他映射了过滤器的资源构建过滤器链。对于链中的每个过滤器,传递给它的过滤器链对象依次表示要调用的剩余过滤器,然后是目标servlet。

例如,如果有两个过滤器,则该机制的关键步骤如下:

1.请求目标servlet容器检测到有两个过滤器并创建过滤器链

2.链中的第一个filter由其doFilter()方法调用。

3.第一个filter完成任何预处理,然后调用filter链doFilter()方法。这导致第二个filter被其doFilter()方法调用。

4.第二个过滤器完成任何预处理,然后调用过滤器链的doFilter()方法。这导致目标servlet被其service()方法调用。

5.当目标servlet完成时,第二个过滤器中的链doFilter()调用返回,第二个过滤器可以进行任何后处理。

6.当第二个过滤器完成时,第一个过滤器中的链doFilter()调用返回,第一个过滤器可以进行任何后处理。

7.当第一个过滤器完成时,执行完成。

可以在servlet和servlet容器之间插入过滤器,以包装和预处理请求,或包装和后处理响应。没有一个过滤器知道它们的顺序。订购完全通过过滤器链处理,根据在web中配置过滤器的顺序。xml

 类似资料:
  • 我试图将CORS过滤器添加到SpringWeb应用程序中,但该过滤器未被执行。我在这里遵循了相关步骤:https://spring.io/guides/gs/rest-service-cors/无济于事。我没有用Spring靴。我正在3.0 servlet规范容器中使用Spring的WebApplicationInitializer引导我的应用程序。 我的应用程序中的其他一切都在工作:配置类、控制

  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 主要内容:FilterChain 接口,Filter 链的拦截过程,Filter 链中 Filter 的执行顺序,示例在 Web 应用中,可以部署多个 Filter,若这些 Filter 都拦截同一目标资源,则它们就组成了一个 Filter 链(也称过滤器链)。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到传递给目标资源。 FilterChain 接口 javax.servlet 包中提供了一个 FilterChain 接口,该接口由容器实现。容器将其实例对象

  • 我已将过滤器配置如下,但在Spring Security Filter链之前不会调用它。我已将顺序设置为零 我使用的是Spring Boot 1.3,它支持在过滤器上设置顺序

  • 我意识到Spring security构建在筛选器链上,这些筛选器将拦截请求、检测(没有)身份验证、重定向到身份验证入口点或将请求传递给授权服务,并最终让请求命中servlet或抛出安全异常(未经身份验证或未经授权)。DelegatingFitlerProxy将这些筛选器粘在一起。为了执行它们的任务,这些筛选访问服务,如UserDetailsService和AuthenticationManage

  • 我注意到,当您将Maven项目配置为使用属性过滤时,属性过滤似乎在非Maven IntelliJ“make”期间也能工作。这意味着Jetty/Tomcat/GWT/Glassfish的IntelliJ run配置仍将尊重您的maven资源过滤。 所以如果我把这个添加到我的pom中。xml: 它应该过滤我的属性和peristence中的任何属性。开始任何intellij运行配置之前的xml文件。这对