美文网首页
[096]技术-filter和责任链模式

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

作者: shawnxjf | 来源:发表于2017-12-16 21:49 被阅读0次

    什么是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中都是使用责任链模式来处理这些 链条调用问题。

    相关文章

      网友评论

          本文标题:[096]技术-filter和责任链模式

          本文链接:https://www.haomeiwen.com/subject/csuewxtx.html