涉及到的类:
1:Request.java 负责请求信息
2:Response.java 负责返回信息的处理
3:FilterChain.java 过滤器链
4:Filter.java 过滤器接口类
5:HtmlFilter.java html字符特殊字符过滤器
6:SensitiveFilter.java 敏感字符的过滤器
7:Main.java 模拟程序的客户端测试程序
下面分别依次看代码:
Request.java
package com.gd.filter.web;
/**
*
* @author Sandy
* 请求对象
*/
public class Request {
String requestString;
public String getRequestString() {
return requestString;
}
public void setRequestString(String requestString) {
this.requestString = requestString;
}
}
Response.java
package com.gd.filter.web;
/**
*
* @author Sandy
* 响应对象
*/
public class Response {
String responseString;
public String getResponseString() {
return responseString;
}
public void setResponseString(String responseString) {
this.responseString = responseString;
}
}
FilterChain.java
package com.gd.filter.web;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author Sandy
* 过滤器链
*/
public class FilterChain implements Filter {
List<Filter> filters = null;
int index = 0;
public FilterChain() {
super();
filters = new ArrayList<Filter>();
}
/*往filter链中添加一个过滤器,这里用到了个一个技巧就是返回this对象,这样可以实现添加完成一个
*过滤器链后,还可以紧接着添加下一个filter
*this.add(filter1).add(filter2)的方式
*/
public FilterChain add(Filter filter) {
this.filters.add(filter);
return this;
}
//过滤方法
public void doFilter(Request request, Response response, FilterChain chain) {
if (index == filters.size())
return;
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, chain);
}
}
Filter.java
package com.gd.filter.web;
/**
*
* @author Sandy
* 创建一个Filter接口
*/
public interface Filter {
void doFilter(Request request,Response responses,FilterChain chain);
}
HtmlFilter.java
package com.gd.filter.web;
/**
*
* @author Sandy
* html中特殊字符替换过滤器
*/
public class HtmlFilter implements Filter {
public void doFilter(Request request, Response response, FilterChain chain) {
request.requestString = request.requestString.replace("<", "[")
.replace(">", "]")
+ "------HtmlFilter()";
chain.doFilter(request, response, chain);
response.responseString += "-------------+HtmlFilter()";
}
}
SensitiveFilter.java
package com.gd.filter.web;
/**
* @author Sandy
* 替换敏感字符的过滤器
*/
public class SensitiveFilter implements Filter {
public void doFilter(Request request, Response response, FilterChain chain) {
request.requestString = request.requestString.replace("被抓住", "抓住")
.replace("被扣留", "扣留")
+ "----------SensitiveFilter()";
chain.doFilter(request, response, chain);
response.responseString += "SensitiveFilter()";
}
}
Main.java
package com.gd;
import com.gd.filter.web.FilterChain;
import com.gd.filter.web.HtmlFilter;
import com.gd.filter.web.Request;
import com.gd.filter.web.Response;
import com.gd.filter.web.SensitiveFilter;
/**
*
* @author Sandy
* 主客户端测试程序
*/
public class Main {
/**
* @param args
*/
public static final String NEW_STRING = "<javaSrcipt>,被抓住,被扣留";
public static void main(String[] args) {
Request request = new Request();
request.setRequestString(NEW_STRING);
Response response = new Response();
response.setResponseString("response--------");
FilterChain chain = new FilterChain();
chain.add(new HtmlFilter()).add(new SensitiveFilter());
chain.doFilter(request, response, chain);
System.out.println(request.getRequestString());
System.out.println(response.getResponseString());
}
}
附件中是完整的模拟servlet的filter