Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Filter.doFilter方法中chain.doFilter在做什么?_Java_Servlet Filters - Fatal编程技术网

Java 在Filter.doFilter方法中chain.doFilter在做什么?

Java 在Filter.doFilter方法中chain.doFilter在做什么?,java,servlet-filters,Java,Servlet Filters,在一个方法中,我做了这个调用 doFilter在doFilter中做什么?它不是一个递归调用吗?它是在调用链对象的doFilter方法,而不是它本身,所以它不是递归的 名称chain表示您有一个过滤器序列,每个过滤器进行一些处理,然后传递到序列中的下一个过滤器,因此每个对象都有一个chain成员,指向序列中的下一个过滤器,在过滤器执行其自己的处理后调用该过滤器。序列中的最后一个可能将null作为链的值,或者它自己知道它是序列中的最后一个。它在内部调用过滤器链中下一个过滤器的doFilter,当链

在一个方法中,我做了这个调用


doFilter
doFilter
中做什么?它不是一个递归调用吗?

它是在调用
对象的
doFilter
方法,而不是它本身,所以它不是递归的


名称
chain
表示您有一个过滤器序列,每个过滤器进行一些处理,然后传递到序列中的下一个过滤器,因此每个对象都有一个
chain
成员,指向序列中的下一个过滤器,在过滤器执行其自己的处理后调用该过滤器。序列中的最后一个可能将
null
作为
链的值,或者它自己知道它是序列中的最后一个。

它在内部调用过滤器链中下一个过滤器的
doFilter
,当链结束时,它调用目标servlet。

servlet过滤器是设计模式的实现


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

通过调用chain.doFilter,您将请求/响应传递给过滤器链中的下一个过滤器。如果不调用它,那么下一个过滤器(可能在web.xml中定义)将不会执行


如果您只是调用doFilter,那么是的,您将有无止境的递归和堆栈溢出。但是,您正在调用filterChain对象的doFilter方法,该方法指示它执行下一个筛选器。

没有您正在谈论的任何代码,我只能假设您是这样的:

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()。正如另一个答案中提到的,这是众所周知的责任链设计模式。

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

这似乎是c#,此帖子标记为java。但是答案仍然是正确的。我相信上面的代码是有效的Java代码吗?我只是修正了构造函数的名称……可能是,我很困惑,因为我从来没有在java only java.servlet.Filter中看到filterAPI接口。也许这只是我自己的无知。FilterAPI来自哪里?FilterAPI只是一个虚构的名称…过滤器的API;-)