本人对责任链模式理解不深也不透彻,本文仅是针对下面提出问题的解决,这个模式和责任链模式有联系,仅此而已,若偶遇本文,看看就好(;′⌒`)
问题背景:
信息从客户端发送到服务器,信息从服务器发送到客户端显示,都要经过一系列对信息的过滤处理,假设从服务器发送到客户端对信息处理过程是从客户端发送到服务器的处理过程的逆序。比如从客户端到服务器端,信息进行这样的过滤HTMLFilter->SenstiveFilter->FaceFilter,则从服务器端到客户端就是FaceFilter->SenstiveFilter->HTMLFilter这样的顺序对信息过滤处理
特点:处理模式类似,处理细节不同,处理的模式随时可能增删
解决的方法:
将所有处理模式抽象到一个接口Filter中,让所有不同的处理模式实现接口,再定义一个处理模式链FilterChain,也实现Filter接口,并让FilterChain持有所有实现了Filter接口的类的对象的引用,把所有的处理模式统一归由FilterChain管理
List<Filter> filters = new ArrayList<Filter>();
并通过addFilter()方法来动态向过滤器中添加新的过滤器(并未写过滤器删除器,可以自行添加)
public FilterChain addFilter(Filter filter) {
filters.add(filter);
return this;
}
实现顺序处理再次逆序处理:
FilterChain中的方法 ,也是最为核心的方法
public void doFilter(Request req,Response resp,FilterChain chain) {
if(index == filters.size()) return;
Filter f = filters.get(index);
index++;
f.doFilter(req,resp,chain);
}
在各个实现了Filter接口的过滤器类中,通过该方法进行具体的过滤处理
public void doFilter(Request req,Response resp,FilterChain chain) {
//处理request字符串
chain.doFilter(req,resp,chain);
//处理response字符串
}
具体代码如下:
Filter接口
package com.chouwu;
public interface Filter {
void doFilter(Request request,Response response,FilterChain filterChain) ;
}
FilterChain过滤器链
package com.chouwu;
import java.util.List;
import java.util.ArrayList;
public class FilterChain implements Filter {
List<Filter> filters = new ArrayList<Filter>();
int index = 0;
public FilterChain addFilters(Filter f) {
filters.add(f);
return this;
}
@Override
public void doFilter(Request request, Response response,
FilterChain filterChain) {
if(index == filters.size()) return;
/*
* 下面三行的顺序不可发生改变
* 如果index在f.doFilter();后面,那么index就始终无法增长,因为doFilter()将一直运行不出来知道结束所有过滤
* 如果没有中间变量f辅助,也不行,因为还没得到filters.get(0),直接就是filters.get(1)了
*/
Filter f = filters.get(index);
index ++;
f.doFilter(request, response, filterChain);
}
}
HTMLFilter干扰性网页语言过滤器
package com.chouwu;
public class HTMLFilter implements Filter {
@Override
public void doFilter(Request request,Response response,FilterChain filterChain) {
request.request = request.request.replace("<","[").replace(">", "]")+"-----HTMLFilter";
filterChain.doFilter(request, response, filterChain);
response.response = response.response +"-----HTMLFilter";
}
}
SenstiveFilter敏感词汇过滤器
package com.chouwu;
public class SenstiveFilter implements Filter {
@Override
public void doFilter(Request request, Response response,
FilterChain filterChain) {
request.request = request.request.replace("敏感", "和谐" )+ "-----SenstiveFilter";
filterChain.doFilter(request, response, filterChain);
response.response = response.response +"-----SenstiveFilter";
}
}
FaceFilter过滤器
package com.chouwu;
public class FaceFilter implements Filter {
@Override
public void doFilter(Request request, Response response,
FilterChain filterChain) {
request.request = request.request.replace("^_^", "O(∩_∩)O~")+"-----FaceFilter";
filterChain.doFilter(request, response, filterChain);
response.response = response.response +"-----FaceFilter";
}
}
模拟客户端到服务器的Request信息
package com.chouwu;
public class Request {
String request;
public String getRequest() {
return request;
}
public void setRequest(String request) {
this.request = request;
}
}
模拟服务器到客户端的Response信息
package com.chouwu;
public class Response {
String response;
public String getResponse() {
return response;
}
public void setResponse(String response) {
this.response = response;
}
}
测试主程序
package com.chouwu;
public class Main {
public static void main(String[] args) {
String msg = "大家好,^_^,敏感,<script>,Hello World";
Request request = new Request();
Response response = new Response();
request.setRequest(msg);
response.setResponse("response");
FilterChain fc = new FilterChain();
fc.addFilters(new HTMLFilter())
.addFilters(new SenstiveFilter())
.addFilters(new FaceFilter());
fc.doFilter(request, response, fc);
System.out.println(request.getRequest());
System.out.println(response.getResponse());
}
}
结果如图:
大家好,O(∩_∩)O~,和谐,[script],Hello World-----HTMLFilter-----SenstiveFilter-----FaceFilter
response-----FaceFilter-----SenstiveFilter-----HTMLFilter