我正在尝试理解过滤器链接。正如this question
中所定义的那样所有过滤器都是链接的(按照web.xml中的定义顺序)。 chain.doFilter()正在进入链中的下一个元素。 链的最后一个元素是目标资源/ servlet。
我有兴趣了解容器中的场景背后容器如何处理过滤器链接。有人可以解释如何在容器内处理过滤器链接?
答案 0 :(得分:23)
每个过滤器都会实现javax.servlet.Filter
界面,其中包含一个doFilter()
方法,该方法将request
和response
pair along with a filter chain
作为输入,实现javax.servlet.FilterChain
接口的类的实例(由servlet容器提供)。过滤器链反映过滤器的顺序。 The servlet container
根据web.xml
文件中的配置顺序,为filters
或其他servlet
映射到该资源的资源构建filters
链。对于链中的每个过滤器,传递给它的过滤器链对象表示要按顺序调用的剩余过滤器,后跟目标servlet。
例如,如果有两个filters
,则此机制的关键步骤如下:
1.请求目标servlet
。 container
检测到有两个filters
并创建了filter chain
。
2.链中的第一个filter
由doFilter()
方法调用。
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中配置过滤器的顺序
,完全通过过滤器链处理排序