本文主要采用java设计模式-过滤器模式,模拟双向过滤原理,封装每个request和response过滤内容,采用不定参数机制灵活实双向过滤。
- 创建Filter接口
package filterChain;
//首先创建一个Filter接口
public interface Filter {
//doFilter处理过滤内容
public void doFilter ( Request request,Response response,FilterChain filterChain);
}
- 实现Filter接口,创建FilterOne,FilterTwo。
package filterChain;
//创建FilerOne
public class FilterOne implements Filter {
//实现doFilter方法,并封装request过滤和response过滤
public void doFilter(Request req, Response res, FilterChain filterChain) {
requestProcess(req);
filterChain.doFilter(req, res);
responseProcess(res);
}
//request 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
public void requestProcess(Request req) {
req.setMessage("FilterOne requestProcess");
System.out.println(req.getReMessage().toString());
}
//response 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
public void responseProcess(Response res) {
res.setMessage("FilterOne responseProcess");
System.out.println(res.getReMessage().toString());
}
}
package filterChain;
//创建FilterTwo
public class FilterTwo implements Filter {
public void doFilter(Request req, Response res, FilterChain filterChains) {
requestProcess(req);
filterChains.doFilter(req, res);
responseProcess(res);
}
//request 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
public void requestProcess(Request req) {
req.setMessage("FilterTwo requestProcess");
System.out.println(req.getReMessage().toString());
}
//response 过滤方法处理流程,如果想包装更好点可以单独封装成一个单独类
public void responseProcess(Response res) {
res.setMessage("FilterTwo responseProcess");
System.out.println(res.getReMessage().toString());
}
}
- request创建
package filterChain;
public class Request {
private String reMessage;
//setMessage方法
public void setMessage(String requesMessage) {
this.reMessage = requesMessage
}
//getMessage方法
public String getReMessage() {
return reMessage;
}
}
- response
package filterChain;
public class Response {
private String reMessage;
//setMessage方法
public void setMessage(String requesMessage ) {
this.reMessage = requesMessage
}
//getMessage
public String getReMessage() {
return reMessage;
}
}
- FilterChain
package filterChain;
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
private List<Filter> filterChain = new ArrayList<Filter>();
private int index = 0;
//增加Filter
public void addFilter(Filter... filters) {
if (filters != null) {
for (Filter filter : filters) {
this.filterChain.add(filter);
}
} else {
System.out.println("null filter add");
}
}
//删除Filter
public void removeFilter(Filter... filters) {
if (filters != null) {
for (Filter filter : filters) {
this.filterChain.remove(filter);
}
} else {
System.out.println("null filter remove");
}
}
//获取所有filter
public List<Filter> getFilterChain() {
return filterChain;
}
public void doFilter(Request req, Response res) {
if (index == this.filterChain.size()) {
index = 0;
return;
}
Filter filter = this.filterChain.get(index);
index++;
filter.doFilter(req, res, this);
}
}
- 测试代码
package filterChain;
public class TestMyFileter {
public static void main(String[] args) {
FilterChain mFilterChain = new FilterChain();
mFilterChain.addFilter(new FilterOne(), new FilterTwo());
Request request = new Request();
request.setMessage("initial request message");
System.out.println(request.getReMessage());
Response response = new Response();
response.setMessage("initial response message");
System.out.println(response.getReMessage());
mFilterChain.doFilter(request, response);
}
}
测试结果
initial request message
initial response message
FilterOne requestProcess
FilterTwo requestProcess
FilterTwo responseProcess
FilterOne responseProcess补充
- -
不足:没有实现多线程,很多地方封装的并不完善,不过通过此例能了解双向过滤机制和java责任链模式基本工作原理
- 引用
这个案例主要思路上学堂马士兵老师的责任链模式,和tomcat 部分源码。