什么是doFilter在java的过滤器中的doFilter方法中做什么?

时间:2010-01-13 15:06:11

标签: java servlet-filters

我想知道在我们的dofilter方法中我做了这个电话 chain.doFilter 。什么是doFilter在doFilter中做什么?它不会得到递归调用吗?

6 个答案:

答案 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)

导致调用链中的下一个过滤器,或者如果调用过滤器是链中的最后一个过滤器,则会调用链末尾的资源。