您的位置:首页 > 编程语言 > Java开发

java 之 编码实现Filter学习示例

2012-03-09 15:10 706 查看
public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}
public class HTMLFilter implements Filter {

@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.setRequestStr(request.getRequestStr().replace('<', '[').replace('>', ']'));
chain.doFilter(request, response, chain);
response.setResponseStr("-----------HtmlFilter()");
}

}


public class SensitiveFilter implements Filter {

@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.setRequestStr(request.getRequestStr().replace("s","js"));
chain.doFilter(request, response, chain);
response.setResponseStr("-----------SensitiveFilter()");
}

}


import java.util.ArrayList;
import java.util.List;

public class FilterChain implements Filter {
List<Filter> filters = new ArrayList<Filter>();
int index = 0;
public FilterChain addFilter(Filter f) {
this.filters.add(f);
return this;
}
@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);
}

}


public class Request {
private String requestStr;

public String getRequestStr() {
return requestStr;
}

public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}


public class Response {
private String responseStr="response";

public String getResponseStr() {
return responseStr;
}

public void setResponseStr(String responseStr) {
this.responseStr += responseStr;
}
}


public class TestFilter {

/**
* @param args
*/
public static void main(String[] args) {
String msg = "<script>";
Request request = new Request();
request.setRequestStr(msg);

Response response = new Response();

FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());

fc.doFilter(request, response, fc);

System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}

}


打印结果:

[jscript]

response-----------SensitiveFilter()-----------HtmlFilter()

##########################################################################################

通常我们所访问的资源是一个servlet或jsp页面,而jsp其实是一个被封装了的servlet(每个jsp执行前都会被转化为一个标准的servlet,这点若还有不明白的请自己到网上查一下吧),于是我们就可以统一地认为我们每次访问的都是一个Servlet,而每当我们访问一个servlet时,web容器都会调用该Servlet的service方法去处理请求。而在service方法又会根据请求方式的不同(Get/Post)去调用相应的doGet()或doPost()方法,实际处理请求的就是这个doGet或doPost方法。写过servlet的朋友都应该知道,我们在doGet(或doPost)方法中是通过response.getWriter()得到客户端的输出流对象,然后用此对象对客户进行响应。
到这里我们就应该理解了过滤器的执行流程了:执行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: