java设计模式-责任链

分析下Java web中的过滤器 、拦截器

过滤器:当用户请求(request)服务器时可以添加多个过滤器对请求进行过滤,

每个过滤器对请求有不同的过滤处理

多个过滤器就会形成一个过滤器链条

当过滤链条完成之后,server开始对请求处理

处理完成之后返回结果response

response还会逆序被过滤链条处理

完成之后返回用户 如下图:

代码部分:

请求与返回对象
public class Request {
	public  String RequestString;
}

public class Response {
	public  String ResponseString;
}

//过滤接口
public interface Filter {

	public void doFilter(Request request , Response response , FilterChain chain);
}
过滤实现类
public class HtmlFilter implements Filter{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		request.RequestString = request.RequestString.replace("<", "[").replace(">", "]");
		System.out.println("HtmlFilter  request 处理完成 request.RequestString = "+request.RequestString);
		chain.doFilter(request, response, chain);
		response.ResponseString = response.ResponseString + "  |HtmlFilter response 处理";
		System.out.println("HtmlFilter  response 返回处理完成 response.ResponseString = "+response.ResponseString);

	}
}

public class SensitiveFilter implements Filter{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		request.RequestString = request.RequestString.replace("敏感", "**");
		System.out.println("SensitiveFilter  request 处理完成 request.RequestString = "+request.RequestString);
		chain.doFilter(request, response, chain);
		response.ResponseString = response.ResponseString + "  | SensitiveFilter response 处理 ";
		System.out.println("SensitiveFilter  response 返回处理完成 response.ResponseString = "+response.ResponseString);
	}
}

过滤链条
public class FilterChain {

	private List<Filter> filters = new ArrayList<Filter>();

	public FilterChain addFilter(Filter filter){
		filters.add(filter);
		return this;
	}

	int index = -1;

	public void doFilter(Request request,Response response , FilterChain chain){
		if(filters.size() > ++ index){
			filters.get(index).doFilter(request, response, chain);
		}else if(filters.size() ==  index){
			response.ResponseString = "【server处理代码部分】";
			System.out.println("业务逻辑处理之后的返回:" + response.ResponseString);
		}
	}

}

测试类
public class MainTest {

	public static void main(String[] args) {
		Request req = new Request();
		req.RequestString = "O(∩_∩)O哈哈~ <script>  <style> 我是敏感词";
		Response res = new Response();
		FilterChain chain = new FilterChain();
		chain.addFilter(new HtmlFilter())
				 .addFilter(new SensitiveFilter());
		chain.doFilter(req, res, chain);
	}
}

执行结果
HtmlFilter  request 处理完成 request.RequestString = O(∩_∩)O哈哈~ [script]  [style] 我是敏感词
SensitiveFilter  request 处理完成 request.RequestString = O(∩_∩)O哈哈~ [script]  [style] 我是**词
业务逻辑处理之后的返回:【server处理代码部分】
SensitiveFilter  response 返回处理完成 response.ResponseString = 【server处理代码部分】  | SensitiveFilter response 处理
HtmlFilter  response 返回处理完成 response.ResponseString = 【server处理代码部分】  | SensitiveFilter response 处理   |HtmlFilter response 处理

小结:请求 ——>htmlFilter过滤——>sensitiveFilter过滤——>server处理返回response——>sensitiveFilter处理——>htmlFilter处理

问题:如果遇到一些非法请求需要直接返回该如果做

代码如下:

添加非法过滤类
public class ErrorFilter implements Filter{

	@Override
	public void doFilter(Request request, Response response, FilterChain chain) {
		request.RequestString = request.RequestString.replace("(:", "^-_-^");
		System.out.println("ErrorFilter  request 处理完成 request.RequestString = "+request.RequestString);
		System.out.println("**********在这里出错拦截返回**********");
		boolean flag = false;
		//模拟错误请求
		if(flag){
			chain.doFilter(request, response, chain);
		}
		System.out.println("**********在这里出错拦截返回**********");
		response.ResponseString = response.ResponseString + "  |ErrorFilter response 处理";
		System.out.println("ErrorFilter  response 返回处理完成 response.ResponseString = "+response.ResponseString);
	}
}
修改测试代码
将错误过滤器放在html  与  sensitive之间
public class MainTest {

	public static void main(String[] args) {
		Request req = new Request();
		req.RequestString = "O(∩_∩)O哈哈~ <script>  <style> 我是敏感词";
		Response res = new Response();
		FilterChain chain = new FilterChain();
		chain.addFilter(new HtmlFilter())
				  .addFilter(new ErrorFilter())
				 .addFilter(new SensitiveFilter());
		chain.doFilter(req, res, chain);
	}
}
执行结果
HtmlFilter  request 处理完成 request.RequestString = O(∩_∩)O哈哈~ [script]  [style] 我是敏感词
ErrorFilter  request 处理完成 request.RequestString = O(∩_∩)O哈哈~ [script]  [style] 我是敏感词
**********在这里出错拦截返回**********
**********在这里出错拦截返回**********
ErrorFilter  response 返回处理完成 response.ResponseString = null  |ErrorFilter response 处理
HtmlFilter  response 返回处理完成 response.ResponseString = null  |ErrorFilter response 处理  |HtmlFilter response 处理

看以看到response返回结果中的Null值
该值代表没有经过server直接返回
而且也没有经过sensitiveFilter处理

总结:

在过滤器中如果遇到非法请求 需要直接返回 则不需要调用chain.doFilter() 函数  请求会直接返回.

时间: 2024-11-01 09:00:02

java设计模式-责任链的相关文章

java 设计模式 -- 责任链模式

设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任. 纯责任链和非纯责任链 责任链分为两种.纯责任链和非纯责任链. 纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕.非纯责任链则是待处理对象reques

我的Java设计模式-责任链模式

今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯洁化身的我做这种需求,还露点. 产品经理:误会误会,是放一张暴露一点点的,尺寸不大. 小猿:尼玛~能说清楚些吗,需求模棱两可的.不干,我要上报boss. 产品经理也一阵无语,这豆丁的事还上报boss.话说这上报也得走程序是吧,技术经理就不干了,"凭什么要跳过我,得经过我才能到boss".咦

Java设计模式の责任链模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递, 直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求, 这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓,

java设计模式--责任链模式

责任链模式:将能够处理同一类请求的对象连成一条链,如果不能处理则传递给链上的下一个对象. //请假对象 public class QingjiaRequest { private String name; private int days; private String reason; public QingjiaRequest(String name, int days, String reason) { this.name = name; this.days = days; this.rea

java 设计模式-责任链

package com.test3; //抽象处理类 public abstract class Handler { private Handler nextHandler = null; public Handler getNextHandler() { return nextHandler; } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } // 处理请求 public

设计模式--责任链

Mark:关于责任链Demo. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 类图: 请假--审批(转) 描述: 请假这个事情,相信每个人都不陌生. 我们公司是个相对很宽松的公司. 在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了. 如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了. 如果超过了2天,你就需要去找总经理了,工资

[设计模式] 责任链模式之变种 - 责任链子

今天看到 wikipedia 的责任链模式,好奇之下搜寻相关文章,此文章主要参考 91大的 [.NET]重构之路系列v11 –用责任链模式打破讨厌的switch case 的变种作法,所以跟原本的责任链模式的设计思路不太相同,但结果相同, 所以阅读前,建议先看完91大的文章后,在来看这篇会比较能感觉出差异. ?这边先引用91大文章结尾结论中的补充来复习一下责任链的重点, 20120415 补充:责任链的用意在于把每个角色的职责分清楚,每个对象只需要做好自己的事,透过责任链的方式来组合,并完成使用

Java与设计模式-责任链模式

责任链模式属于行为型设计模式之一,怎么理解责任链?责任链是可以理解成数个对象首尾连接而成,每一个节点就是一个对象,每个对象对应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模式. 生活中可以找到责任链模式的原型吗?这种例子很多,比如你要去买房子,首先是销售人员(对象1)接待你,你说想要百分之3的折扣,没问题,这时销售人员就有打百分之三折扣的权限,销售人员(对象1)进行处理.这时来了一个土豪,说要买10套,要百分之五的折扣,销售人员(对象1)没有百分之五折扣的权限,必须要想上

设计模式——责任链(chain of responsibiltiy)

责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象. 每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象.也就是说责任链决定了任务的处理上方和下方. 该模式还描述了往该处理链的末尾添加新的处理对象的方法.<wiki> 1:建立一个filte接口,用来处理客户度发送给服务器端,以及服务器端返回给客户端的消息. 1 public interface Filter { 2 void doFilter(Reque