tomcat责任链模式
来源:互联网 发布:淘宝客违规推广 编辑:程序博客网 时间:2024/06/09 03:52
本文模拟一个FilterChain过滤器处理请求Request,并且返回Response。
用到的设计模式是,
责任链。
责任链设计模式
每个对象都持有下家对象的引用而形成一条链,请求在这个链条上传递,直到某个对象处理这个请求。发出请求的客户端并不知道该条链子的哪一个对象处理了消息。
代码实现
Request和Response类
public class Request { public String req; public Request(String req) { this.req = req; }}
Filter接口
public interface Filter { void doFilter(Request request, Response response, Filter filterChain);}
public class Response { public String resp = "response";}
HTMLFilter和SensitiveFilter类
public class HTMLFilter implements Filter { @Override public void doFilter(Request request, Response response, Filter filterChain) { request.req = request.req.replace("<", "["); request.req = request.req.replace(">", "]") + "----HTMLFilter"; filterChain.doFilter(request, response, filterChain); response.resp += "-----HTMLFilter"; }}
public class SensitiveFilter implements Filter { @Override public void doFilter(Request request, Response response, Filter filterChain) { request.req = request.req.replace("敏感", "*") + "----SensitiveFilter"; filterChain.doFilter(request, response, filterChain); response.resp += "----SensitiveFilter"; }}
FilterChain类
public class FilterChain implements Filter { private List<Filter> chain = new ArrayList<Filter>(); public void addFilter(Filter filter) { chain.add(filter); } private int index = 0; @Override public void doFilter(Request request, Response response, Filter filterChian) { if (index == chain.size()) return; Filter filter = chain.get(index++); filter.doFilter(request, response, filterChian); }}
测试类Main
public class Main { public static void main(String[] args) { FilterChain filterChain = new FilterChain(); filterChain.addFilter(new HTMLFilter()); filterChain.addFilter(new SensitiveFilter()); Request request = new Request("<敏感词汇>"); Response response = new Response(); filterChain.doFilter(request, response, filterChain); System.out.println(request.req); System.out.println(response.resp); }}
执行结果:
[*词汇]—-HTMLFilter—-SensitiveFilter
response—-SensitiveFilter—–HTMLFilter
小结
- 本文实现的是双向的责任链,web容器对请求的处理也是类似。主要采用迭代的方式对request和response处理,即
filterChain.doFilter(request, response, filterChain),和
filter.doFilter(request, response, filterChian)
这几处代码。 - 也有单向的责任链,实现起来相对简单。
- 责任链的两种划分,
- 内置责任链,链中的各个环节都有对下家的引用,其实是个栈。
- 外置责任链,单独维护一个链条,每个环节都不知道自己的下家。
- 责任链和装饰者的比较,
- 装饰者更像是内置链条的责任链。但就我所使用的情况看,责任链通常是有预定义的链条的;而装饰者更多的是根据实际情况自定义装饰、处理顺序的。
- 装饰者的每一层装饰,都是从不同维度来完成一项工作。比如著名的java中的inputstream,什么文件输入流,有缓存的输入流,字节型输入流等,就是从不同的维度来处理输入流的。
- 责任链也可以采用抽象类实现,大概思路,
- 抽象出一个类,包含处理请求的方法和返回下一个下家的引用。
- 具体工作类重写处理请求的方法。
1 0
- tomcat责任链模式
- Tomcat中的设计模式--责任链模式
- Tomcat源码分析 filter 责任链模式
- 从Tomcat中学习责任链模式
- [tomcat学习] 责任链模式实例
- Tomcat设计模式-责任链模式(二)pipeline valve
- 设计模式之责任链模式(tomcat filters)
- 责任链或过滤器模式3-模拟tomcat的过滤器
- 【责任链模式】Java版简单实例与Tomcat实例
- 责任链或过滤器模式3-模拟tomcat的过滤器
- tomcat责任链设计模式 FilterChain原理解析
- 责任链模式
- 深入浅出责任链模式
- 责任链模式
- 责任链模式
- 深入浅出责任链模式
- 责任链模式(一)
- 责任链模式(二)
- redis.conf配置文件注解
- Spring-ioc
- js调用jquery中的方法
- 斐讯K2 22.4.6.3 非telnet 页面直刷 Breed 详细方法
- 冗余S7400远程监控测试成功
- tomcat责任链模式
- 集群与分布式的简单概念
- Struts方法动态调用
- (POJ 1159)Palindrome <最长公共子序列 / 滚动数组优化 / 记忆化搜索> 简单回文数
- 中美印日四国程序员比较
- JavaScript犯过的错误汇总
- TTL电平、RS232电平、RS485电平的区别(待完善)
- spark集群1.6.2升级为2.0.2
- maven相关