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;-)