过滤器链调用如何工作?

时间:2014-08-08 05:56:09

标签: java java-ee servlet-filters

我正在尝试理解过滤器链接。正如this question

中所定义的那样
  

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

我有兴趣了解容器中的场景背后容器如何处理过滤器链接。有人可以解释如何在容器内处理过滤器链接?

1 个答案:

答案 0 :(得分:23)

每个过滤器都会实现javax.servlet.Filter界面,其中包含一个doFilter()方法,该方法将requestresponse pair along with a filter chain作为输入,实现javax.servlet.FilterChain接口的类的实例(由servlet容器提供)。过滤器链反映过滤器的顺序。 The servlet container根据web.xml文件中的配置顺序,为filters或其他servlet映射到该资源的资源构建filters链。对于链中的每个过滤器,传递给它的过滤器链对象表示要按顺序调用的剩余过滤器,后跟目标servlet。

例如,如果有两个filters,则此机制的关键步骤如下:

enter image description here

1.请求目标servletcontainer检测到有两个filters并创建了filter chain

2.链中的第一个filterdoFilter()方法调用。

3.第一个filter完成所有预处理,然后调用doFilter()的{​​{1}}方法。这会导致其filter chain方法调用第二个filter

4.第二个doFilter()完成所有预处理,然后调用filter的{​​{1}}方法。这会导致目标doFilter()filter chain方法调用。

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

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

7.第一个filter完成后,执行完成。

可以在servlet和servlet容器之间插入过滤器来包装和预处理请求,或者包装和后处理响应。没有过滤器知道他们的订单。根据在web.xml中配置过滤器的顺序

,完全通过过滤器链处理排序