责任链设计模式【过滤器、拦截器】
一、责任链设计模式的引入
我们现在有两段字符
//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); } }