什么是filter
在tomcat servlet容器汇中,我们通过filter来拦截请求和相应来进行一些特殊的处理,比如统一对web请求进行编码转换等。
其请求模式为
request ---> filterA.before ---> fiterB.before ---> web容器处理 ----> filterB.after ---->filterA.after.
那么在代码中如何实现这种请求模式呢?这就用到责任链模式。
责任链模式
我们再web.xml中会定义一些filter,其代码所示:
<filter>A</filter>
<filter>B</filter>
那么其相应的伪代码为:
A{
A.before();
{
B.before()
chain.filter
B.after()
}
A.after();
}
}
在容器启动的时候我们会读取web.xml文件,生成一个List<filter>filterList 作为全局参数,把它放入filterchain对象中。
A.dofilter(request,response,filterChian)
{
dosomething A before ...
filterIterator = filterChian.getFilterIterator();
filetChain.doFilter();
dosomething A after ...
}
//filterChain
filterChain.dofilter(request,response,filterChian)
{
filterIterator = this.getFilterIterator();
fiter f = filterIterator.next(); //filterchain作为参数在各filter之间传递,所以能够取到链条上的各个A->B->C
f.filter(request,response,this); //比如此时f为A,那么调用A.filter(){ filterIterator.next() }获取的就是B
}
责任链模式的应用
在spring 拦截器,web 应用的filter中都是使用责任链模式来处理这些 链条调用问题。
网友评论