这篇文章介绍了责任链模式的应用:本文介绍如果自己实现一个责任链

定义请求和响应信息

简单定义请求类Request(封装一个字符串)

  1. public class Request {
  2. String requestStr;
  3.  
  4. public String getRequestStr() {
  5. return requestStr;
  6. }
  7.  
  8. public void setRequestStr(String requestStr) {
  9. this.requestStr = requestStr;
  10. }
  11. }

简单定义响应类Response

  1. public class Response {
  2. String responseStr;
  3.  
  4. public String getResponseStr() {
  5. return responseStr;
  6. }
  7.  
  8. public void setResponseStr(String responseStr) {
  9. this.responseStr = responseStr;
  10. }
  11.  
  12. }

定义Filter(参数接收Request和Response)

至于为什么接收FilterChain(是为了下面filter里面能够调用FilterChain的doFilter()方法)

定义Filter接口

把Request对象和Response对象交给处理器Filter:处理器既能处理Request对象 也能处理Response对象

  1. public interface Filter {
  2. void doFilter(Request request, Response response, FilterChain chain);
  3. }

定义两个Filter实现类

  1. public class HTMLFilter implements Filter {
  2.  
  3. @Override
  4. public void doFilter(Request request, Response response, FilterChain chain) {
  5. //process the html tag <>
  6. request.requestStr = request.requestStr.replace('<', '[')
  7. .replace('>', ']') + "---HTMLFilter()";
  8. chain.doFilter(request, response, chain);
  9. response.responseStr += "---HTMLFilter()";
  10. }
  11.  
  12. }
  1. public class SesitiveFilter implements Filter {
  2.  
  3. @Override
  4. public void doFilter(Request request, Response response, FilterChain chain) {
  5. request.requestStr = request.requestStr.replace("被就业", "就业")
  6. .replace("敏感", "") + "---SesitiveFilter()";
  7. chain.doFilter(request, response, chain);
  8. response.responseStr += "---SesitiveFilter()";
  9.  
  10. }
  11.  
  12. }

定义FilterChain

  1. public class FilterChain implements Filter {
  2. List<Filter> filters = new ArrayList<Filter>();
  3. int index = 0;
  4.  
  5. public FilterChain addFilter(Filter f) {
  6. this.filters.add(f);
  7. return this;
  8. }
  9.  
  10. @Override
  11. public void doFilter(Request request, Response response, FilterChain chain) {
  12. if(index == filters.size()) return ;
  13.  
  14. Filter f = filters.get(index);
  15. index ++;
  16. f.doFilter(request, response, chain);
  17. }
  18. }

main()方法测试

  1. public class Main {
  2.  
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
  8. Request request = new Request();
  9. request.setRequestStr(msg);
  10. Response response = new Response();
  11. response.setResponseStr("response");
  12. FilterChain fc = new FilterChain();
  13. fc.addFilter(new HTMLFilter())
  14. .addFilter(new SesitiveFilter())
  15. ;
  16.  
  17. fc.doFilter(request, response, fc);
  18. System.out.println(request.getRequestStr());
  19. System.out.println(response.getResponseStr());
  20. }
  21.  
  22. }

以上代码特点是 Request的处理是正序 Response的处理时倒序:

方便大家看清步骤:这是断点执行顺序

Filter里面调用了filterChain的doFilter方法

FilterChain里面调用了filter的doFilter方法

模拟javaWeb责任链的设计的更多相关文章

  1. 重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 场地和场景的重要性 射击

  2. java责任链模式及项目实际运用

    1.前言 上次我们认识了java责任链模式的设计,那么接下来将给大家展示责任链模式项目中的实际运用.如何快速搭建责任链模式的项目中运用. 2.简单技术准备 我们要在项目中使用借助这样的几个知识的组合运 ...

  3. 设计模式——责任链(结合Tomcat中Filter机制)

    设计模式:责任链模式 说责任链之前,先引入一个场景,假如规定学生请假小于或等于 2 天,班主任可以批准:小于或等于 7 天,系主任可以批准:小于或等于 10 天,院长可以批准:其他情况不予批准:以此为 ...

  4. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  5. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

  6. 浅谈Java五大设计原则之责任链模式

    首先我们得先定义一个责任链模式: 责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中, 由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个 ...

  7. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  8. 由浅入深讲解责任链模式,理解Tomcat的Filter过滤器

    本文将从简单的场景引入, 逐步优化, 最后给出具体的责任链设计模式实现. 场景引入 首先我们考虑这样一个场景: 论坛上用户要发帖子, 但是用户的想法是丰富多变的, 他们可能正常地发帖, 可能会在网页中 ...

  9. 【设计模式】 模式PK:观察者模式VS责任链模式

    1.概述 为什么要把观察者模式和责任链模式放在一起对比呢?看起来这两个模式没有太多的相似性,真没有吗?回答是有.我们在观察者模式中也提到了触发链(也叫做观察者链)的问题,一个具体的角色既可以是观察者, ...

随机推荐

  1. elasticsearch 基础 —— 索引、更新文档

    索引文档 通过使用 index API ,文档可以被 索引 -- 存储和使文档可被搜索 . 但是首先,我们要确定文档的位置.正如我们刚刚讨论的,一个文档的 _index . _type 和 _id 唯 ...

  2. Redis5.0集群搭建实战

    安装环境: 6台 centos7.4 在各个节点下载官网release包,可以自己去官网找: wget  http://download.redis.io/releases/redis-5.0.5.t ...

  3. 4.VUE前端框架学习记录四:Vue组件化编码2

    VUE前端框架学习记录四:Vue组件化编码2文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  4. 解决js ajax跨越请求 Access control allow origin 异常

    // 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*");

  5. 【学习笔记】整体二分(BZOJ2738矩阵乘法)

    也是因为一道题才来学的... 然后就发现这道模板貌似是暑假初期在某校集训的时候的比赛题 并且好像没改= = 前置芝士 1.二分= = * CDQ分治[你要是知道CDQ分治的话这玩意就很好理解啦] *本 ...

  6. mui is not defined

    vue项目中引用mui.js,我是在main.js中这样引入的,    结果报错  查找资料,最后在mui.js的最后添加了这样一句  这是因为mui并不能像jquery那样作为全局对象存在,加上wi ...

  7. 4412 4路pwm输出

    一.4412 xpwmTOUT1 这是4412的GPD0_1路,itop中被使用为LCD的背光电路的pwm功能.因此如果使用教程中的代码,同样操作GPD0_1是行不通的. 会出现错误,所以需要解除在内 ...

  8. HDU - 6621 K-th Closest Distance 主席树+二分答案

    K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...

  9. CocoaPods中pod search报错的解决办法

    pod search报错的原因: 每次使用pod search命令的使用会在该目录下生成一个search_index.json文件,会逐渐的增大,文件达到一定大小后,ruby解析里面的json字符就会 ...

  10. buuctf | [强网杯 2019]随便注

    1' and '0,1' and '1  : 单引号闭合 1' order by 3--+ : 猜字段 1' union select 1,database()# :开始注入,发现正则过滤 1' an ...