码迷,mamicode.com
首页 > 其他好文 > 详细

Filter技术+职责链模式

时间:2014-07-30 20:52:44      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   java   文件   2014   html   ar   

     Filter是一个过滤器,存在Web客户端与请求的资源之间,这里的资源可以说是jsp或servlet。它的作用就是在请求达到资源之前,先对请求进行预处理,并且也可以对servlet处理后的response进行修改。

   Filter可以是有很多个,当一个个Filter组合成起来,就形成了一个FilterChain。也就是我们说的过滤链,这个过滤链处理的过程,就是我们前面学的职责链模式的一个体现。 

   下面是一个修改字符串的小例子:  

 

1.FilterChain内包含各个子filter,利用dofilter()进行传递请求和响应

public class FilterChain implements Filter {	
	List<Filter> filters = new ArrayList<Filter>();  //定义一个存放filter的集合
	int index = 0; 
	public FilterChain addFilter(Filter f){		
		this.filters.add(f);    //添加Filte
		return this;
	}	
	@Override
	public void doFilter(Request request, Response response,FilterChain chain) {
		//循环遍历每一个Filter
		if(index == filters.size()) return;
			Filter f = filters.get(index);			
			index ++;
		//并且利用doFilter()方法接收request和response
			f.doFilter(request, response, chain);			
	}	
}


2.HTMLFilter:修改字符串的标签,请求过来之后,调用chain.dofilter()方法,继续传递请求。


package com.bjsrt.dp.filter;
public class HTMLFilter implements Filter {	
	@Override
	public void doFilter(Request request, Response response,FilterChain chain) {		
		System.out.println("FilterChain调用dofilter(),获取HTMLFilter的请求命令!");
		request.requestStr = request.requestStr.replace('<', '[')
				.replace('>', ']')+"----HTMLFilter()";
		chain.doFilter(request, response, chain);		
		response.responseStr += "----HTMLFilter()";
		System.out.println("获取HTMLFilter的请求响应!");		
	}	
}

3.SesitiveFilter:处理敏感词,请求过来之后,调用chain.dofilter()方法,发现没有下一个请求了,进行响应。

package com.bjsrt.dp.filter;

public class SesitiveFilter implements Filter {
	@Override
	public void doFilter(Request request, Response response,FilterChain chain) {		
		System.out.println("调用SesitiveFilter的dofilter方法,获取请求命令!!");		
		request.requestStr = request.requestStr.replace("被就业", "就业")
				 .replace("敏感,","")+"-----SesitiveFilter()";
		chain.doFilter(request, response, chain);
		response.responseStr +="--SesitiveFilter()";		
		System.out.println("获取SesitiveFilter的请求响应!");
	}	
}

4.客户端方法:设置处理filter链的执行顺序

package com.bjsrt.dp.filter;

public class Main {
	public static void main(String[] args) {
		
		String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";   //这是一个消息(request)
		Request request = new Request();
		request.setRequestStr(msg);
		Response response = new Response();
		response.setResponseStr("response");		
		FilterChain fc = new FilterChain();
		
		//设置请求处理的顺序
		fc.addFilter(new HTMLFilter())
		  .addFilter(new SesitiveFilter());		
		fc.doFilter(request, response,fc);
		
		//打印出请求和响应
		System.out.println(request.getRequestStr());
		System.out.println(response.getResponseStr());		
	}

}

效果显示:

bubuko.com,布布扣

    从效果显示的结果来看,FilterChain的执行顺序遵循先进后出的原则:当Web客户端发送一个request的时候,这个request先是会经过FilterChain,由它利用dofilter()方法调用各个子filter,至于子filter的执行顺序如何,则看客户端是如何制定规则的。request被第一个处理之后,又通过dofilte()往下传送,被第二个、第三个...filter截获处理。当request被所求的资源处理之后,返回的顺序是从最后一个开始进行返回,直到返回到客户端。

   

    filterChain的处理很好的体现了职责链模式。事实上 filterChain的在java中已经封装好了,并不需要我们去实现,我们只需要调用其dofilter()的方法,进行传递request和response。而filter的执行顺序是放在xml配置文件进行配置。

   总结:Filter技术是对请求到jsp或servlet的request和response进行拦截,可以进行一系列的处理,处理之后又传递给下一个。filter技术也是将重复性的服务抽出来,放在配置文件中。到时候我们修改的时候,只需要到配置文件中修改,就能对所有的jsp和servlet起作用。  



Filter技术+职责链模式,布布扣,bubuko.com

Filter技术+职责链模式

标签:style   blog   http   java   文件   2014   html   ar   

原文地址:http://blog.csdn.net/mingxuanyun/article/details/38236005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!