从前往后按照一定操作顺序进行
申明一个过滤器接口,里面有一个“方法申明” 叫 规则过滤,返回处理后的结果
申明一些具体的操作类,全部实现过滤器接口,重写里头规则过滤的方法,返回规则处理后的结果
写法:
返回结果 m= new 具体实现类().规则过滤();
更多的操作类组成的规则过滤 集合 可以放到一个数组里,接着按照遍历操作数组,按照顺序操作即可
for(Filter f:filters){
r=f.doFilter(r);
}
return r;
形成就是规则过滤链
责任链的拼接方式
申明一个责任链的类。用ArrayList 来存储 对应链里的对象,一个拼接责任链的方法 ,遍历责任链按顺序操作的方法
在处理过程类里写法:
责任链的类 fc;
设置get set 方法
所有的处理过程全部丢给 fc来处理
return fc.遍历责任链按顺序操作的方法(xxx);
主方法里的写法:
FilterChain fc=new FilterChain();
fc.addFilter(new HTMLFilter())
.addFilter(new SensitiveFilter())
.addFilter(new FaceFilter());
这里注意一个小技巧,把FilterChain 类型里的addFilter 方法的返回值不要设置为void ,而要设置为 责任链的类 为返回值,方法体return this;
这样就可以直接链条式编程了,fc.xxxx().yyyy().zzzz()
然后把fc set 到 处理过程类的对象里去
mp.setFc(fc);
更进一步,申明一个责任链的类让它实现 过滤器接口。 让责任链中加入责任链,可以
fc.addFilter(fc2);
让过滤器可以重用,既过滤传过去的数据也过滤传回的数据
申明一个过滤器接口,里面有一个“方法申明” 叫 规则过滤,参数为(请求,回应)返回值为空
申明一些具体的操作类,全部实现过滤器接口,重写里头规则过滤的方法,填充请求和回应的内容,返回空
责任链的类因为也实现过滤器接口,要改变参数,填充请求和回应的内容,返回空
具体操作类,重写方法
为了实现过去顺序处理,回来倒序处理 的方式,在filter里引入一个FilterChain 参数,知道这个Chain后 接着往后处理即可
filterChain
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
if(index==filters.size()) return;
Filter f=filters.get(index);
index++;
f.doFilter(request, response, chain);
}
HTMLFilter
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.RequestStr=request.RequestStr.replace('<','[').replace('>', ']');
chain.doFilter(request, response, chain);
response.ReponseStr+="----HTMLFilter()";
}
SensitiveFilter
@Override
public void doFilter(Request request, Response response,FilterChain chain) {
request.RequestStr.replace("被就业", "就业").replace("敏感", "");
chain.doFilter(request, response, chain);
response.ReponseStr+="----sensitiveFilter()";
}
其他的内容不变
可以通过给程序打断点的方式,进入程序栈里头看看调用和返回顺序(选择进入和继续运行 的调试选项)