gpt4 book ai didi

java - 过滤器链调用如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:10 25 4
gpt4 key购买 nike

我正在尝试了解过滤器链。如 this question 中所定义

All filters are chained (in the order of their definition in web.xml). The chain.doFilter() is proceeding to the next element in the chain. The last element of the chain is the target resource/servlet.

我有兴趣了解容器在幕后如何处理过滤器链。有人可以解释一下容器内部如何处理过滤器链吗?

最佳答案

每个过滤器都实现了 javax.servlet.Filter接口(interface),其中包括 doFilter()request 作为输入的方法和 response pair along with a filter chain ,它是实现 javax.servlet.FilterChain 的类(由 servlet 容器提供)的实例界面。过滤器链反射(reflect)了过滤器的顺序。 The servlet container , 基于 web.xml 中的配置顺序文件,构造filters的链对于任何 servlet或其他具有 filters 的资源映射到它。对于链中的每个过滤器,传递给它的过滤器链对象表示要调用的剩余过滤器,按顺序,然后是目标 servlet。

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

enter image description here

1.目标servlet被要求。 container检测到有两个 filters并创建 filter chain .

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

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

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

5.当目标servlet完了,上链doFilter()调用第二个filter返回,第二个 filter可以进行任何后处理。

6.当第二个filter完了,上链doFilter()先打电话filter返回,第一个 filter可以进行任何后处理。

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

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

关于java - 过滤器链调用如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25196867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com