我想知道在我们的dofilter方法中我做了这个电话 chain.doFilter 。什么是doFilter在doFilter中做什么?它不会得到递归调用吗?
答案 0 :(得分:51)
Servlet过滤器是Chain of responsibility设计模式的实现。
所有过滤器都是链接的(按照web.xml中的定义顺序)。 chain.doFilter()
正在进入链中的下一个元素。链的最后一个元素是目标资源/ servlet。
答案 1 :(得分:13)
它正在调用doFilter
对象的chain
方法,而不是它本身,所以不,它不会递归。
名称chain
表示您有一系列过滤器,每个过滤器都会进行一些处理,然后按顺序传递给下一个过滤器,因此每个对象都有一个chain
成员指向序列中的下一个过滤器,在过滤器执行自己的处理后调用。然后,序列中的最后一个可能会null
作为chain
值,或者它自己知道它是序列中的最后一个。
答案 2 :(得分:2)
在内部,它调用过滤器链中下一个过滤器的doFilter
,当链接结束时,它会调用目标servlet。
答案 3 :(得分:1)
通过调用chain.doFilter,您将请求/响应处理到过滤器链中的下一个过滤器。如果您不调用它,则不会执行下一个过滤器(可能在您的web.xml中定义)。
如果你刚刚调用了doFilter,那么肯定会有无休止的递归和堆栈溢出。但是,您正在调用filterChain对象的doFilter方法,该方法指示它执行下一个过滤器。
答案 4 :(得分:1)
没有你正在谈论的任何代码,我只能假设你像:
class Filter implements FilterAPI {
private FilterAPI chain;
FilterAPI(FilterAPI chain) { this.chain = chain; }
@override void doFilter (Set setToFilter) {
// do some filtering on setToFilter
chain.doFilter(setToFilter);
}
}
如果是这种情况,那么你不是以递归方式调用任何东西,而是在另一个对象上调用doFilter()。正如另一个答案中所提到的,这是众所周知的责任链设计模式。
答案 5 :(得分:1)
导致调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则会调用链末尾的资源。