[096]技术-filter和责任链模式

什么是filter

在tomcat servlet容器汇中,我们通过filter来拦截请求和相应来进行一些特殊的处理,比如统一对web请求进行编码转换等。
其请求模式为
request ---> filterA.before ---> fiterB.before ---> web容器处理 ----> filterB.after ---->filterA.after.

那么在代码中如何实现这种请求模式呢?这就用到责任链模式。

责任链模式

我们再web.xml中会定义一些filter,其代码所示:

 A
 B

那么其相应的伪代码为:

A{
    A.before();
    {
       B.before()
       chain.filter
       B.after()
    }
    A.after();
}
}

在容器启动的时候我们会读取web.xml文件,生成一个ListfilterList 作为全局参数,把它放入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中都是使用责任链模式来处理这些 链条调用问题。

你可能感兴趣的:([096]技术-filter和责任链模式)