责任链设计模式【过滤器、拦截器】

一、责任链设计模式的引入

我们现在有两段字符

//request 进行两层过滤:1、HTML标记过滤  2、敏感词过滤
request.requestStr="我操!<script></script>";
//response 进行两层过滤:1、敏感词过滤 2、HTML标记过滤
response.responseStr="测试责任链:";

二、责任链的设计

1、Filter 接口的设计

public interface Filter {
    /**
     * 
     * @param request
     * @param response
     * @param filterChain:
     *             存储所有的过滤器,传入的目的是:为了层层调下一个过滤器。
     *             然后层层返回,在response的时候,就按照相反的顺序来调用过滤器。
     *             相当于使用栈来解决反序的问题。
     */
    void doFilter(Request request,Response response,FilterChain filterChain);
}

 

2、HTML过滤器的设计

public class HTMLFilter implements Filter{

    @Override
    public void doFilter(Request request, Response response,
            FilterChain filterChain) {
        //替换字符
        request.requestStr=request.getRequestStr().replaceAll("<", "[").replaceAll(">", "]")+"  HTMLFilter.";
        //调用下一个过滤器的执行
        filterChain.doFilter(request, response, filterChain);
        //等着所有过滤器执行完,递归返回后,执行response过滤器
        response.responseStr+="HTMLFilter";
    }

}

3、敏感词的过滤器

public class SesitiveFilter implements Filter{
    
    @Override
    public void doFilter(Request request, Response response,
            FilterChain filterChain) {
        request.requestStr=request.getRequestStr().replaceAll("我操", "****")+" SesitiveFilter";
        filterChain.doFilter(request, response, filterChain);
        response.responseStr+="SesitiveFilter  ";
    }
}

4、过滤器链的实现

package com.lyjs.filter;

import java.util.ArrayList;

public class FilterChain implements Filter{
    //保存所有的过滤器
    ArrayList<Filter> filters=new ArrayList<Filter>();
    //过滤器计数器
    int index=0;
    //加入过滤器 返回当前对象,方便加入
    public FilterChain addFilter(Filter filter){
        filters.add(filter);
        return this;
    }
    @Override
    public void doFilter(Request request, Response response,
            FilterChain filterChain) {
        if(index==filters.size()) return;
        filters.get(index++).doFilter(request, response, filterChain);
    }
    
}

5、测试

public class Main {
        public static void main(String[] args) {
            FilterChain filterChain=new FilterChain();
            filterChain.addFilter(new HTMLFilter())
                       .addFilter(new SesitiveFilter());
            Request request=new Request();
            Response response=new Response();
            //request 进行两层过滤:1、HTML标记过滤  2、敏感词过滤
            request.requestStr="我操!<script></script>";
            //response 进行两层过滤:1、敏感词过滤 2、HTML标记过滤
            response.responseStr="测试责任链:";
            filterChain.doFilter(request, response, filterChain);
            System.out.println(request.requestStr);
            System.out.println(response.responseStr);
        }
}

posted @ 2016-07-27 19:15  LyJs  阅读(725)  评论(0编辑  收藏  举报