责任链模式(ChainOfResponsibiliby、Filter)
Request 类:
package com.demo;
public class Request {
private String requestStr;
public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
Response 类:
package com.demo;
public class Response {
private String responseStr;
public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}
Filter 接口:
package com.demo;
public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}
FilterChain 类,实现Filter接口,重写doFilter()方法,用来遍历过滤器链中所有的filter:
package com.demo;
import java.util.ArrayList;
public class FilterChain implements Filter{
//过滤器链
private ArrayList<Filter> chain = new ArrayList<Filter>();
//过滤器链的索引
int index = 0;
//往过滤器链中添加过滤器
public ArrayList<Filter> add(Filter filter){
chain.add(filter);
return chain;
}
/**
* 重写 doFilter方法
* 如果没有遍历完,调用特定过滤器的doFilter方法
*/
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//如果遍历完过滤器链,则返回
if(index == this.chain.size()) return;
Filter filter = this.chain.get(index);
index ++;
filter.doFilter(request, response, chain);
}
}
HTMLFilter (Fiter接口的实现类):
package com.demo;
public class HTMLFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//处理过滤器该干的事情
request.setRequestStr(request.getRequestStr().replace('<', '[').replace('>', ']')
+ "---HTMLFilter()");
//跳往下一个过滤器
chain.doFilter(request, response, chain);
//回调
response.setResponseStr(response.getResponseStr() + "---HTMLFilter()");
}
}
SensitiveFilter (Fiter接口的实现类):
package com.demo;
public class SensitiveFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//处理过滤器该干的事情
request.setRequestStr(request.getRequestStr().replace("被就业", "就业").replace("敏感", "")
+ "---SensitiveFilter()");
//跳往下一个过滤器
chain.doFilter(request, response, chain);
//回调
response.setResponseStr(response.getResponseStr() + "---SensitiveFilter()");
}
}
Main 执行过滤器操作的类:
package com.demo;
public class Main {
public static void main(String[] args) {
//请求信息
String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
//实例化Request对象
Request request = new Request();
request.setRequestStr(msg);
//实例化Response对象
Response response = new Response();
response.setResponseStr("response");
//过滤器链
FilterChain chain = new FilterChain();
chain.add(new HTMLFilter()).add(new SensitiveFilter());
//开始过滤
chain.doFilter(request, response, chain);
//打印处理结果
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}
思路:
在操作类中调用过滤器链的doFilter方法后,开始遍历过滤器;
当每执行完该过滤器的操作后马上chain.doFilter()方法跳往下一个filter,
当然,下一个filter的操作思路也是一致的,直至所有的request做完后,过滤器链返回;
所有的filter 接着执行doFiter之后的response操作了,而且是逆序的。这样就实现了过滤器的顺着进来,逆着出去的操作。
如果不是很清楚,用debug模式进行调试,从main方法的doFilter开始。
代码:http://pan.baidu.com/s/1kUGVy2F 提取码:9q6z
责任链模式(ChainOfResponsibiliby、Filter)的更多相关文章
- 由浅入深讲解责任链模式,理解Tomcat的Filter过滤器
本文将从简单的场景引入, 逐步优化, 最后给出具体的责任链设计模式实现. 场景引入 首先我们考虑这样一个场景: 论坛上用户要发帖子, 但是用户的想法是丰富多变的, 他们可能正常地发帖, 可能会在网页中 ...
- 设计模式学习笔记(十四)责任链模式实现以及在Filter中的应用
责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求.当有请求发生时,可将请求沿着这条 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- [工作中的设计模式]责任链模式chain
一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- JavaScript责任链模式
介绍 责任链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理 ...
- 设计模式(一)Chain Of Responsibility责任链模式
设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...
- 设计模式《JAVA与模式》之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
随机推荐
- CF1101B Accordion 模拟
前后扫一遍: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib ...
- asp.net mvc 中的 controller和asp.net web api 的apicontroller有什么区别?(转)
本质上区别不大,一个返回html/text类型的response,一个返回json/text或者xml/text类型的response,对于api环境而言,apicontroller更智能一点,他可以 ...
- Mybatis学习笔记(六) —— 动态sql
通过mybatis提供的各种标签方法实现动态拼接sql. 需求:根据性别和名字查询用户 查询sql: SELECT id, username, birthday, sex, address FROM ...
- Vscode 配置 maven debug
# maven.cmd 上方设置此变量 set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address= ...
- C语言变量:名称、地址和值
变量的名称.地址和变量的值之间关系密切. 我们可以认为变量有两个属性:名称和值(其他属性暂不讨论): 计算机编译和加载后也认为变量有两个属性:地址和值.地址就是变量在计算机内部的名称. 许多语言中地址 ...
- Idea如何设置代码超出长度限制时自动换行
在[File]-->[Settings]-->[Code Sytle]中勾选[Wrap on typing]选项
- Impala与Hive的优缺点和异同
定位: HIVE:长时间的批处理查询分析 impala:实时交互式SQL查询 impala优缺点优点: 1. 生成执行计划树,不用多次启动job造成多余开销,并且减少中间结果数据写入磁盘,执行速度快 ...
- idea(1)-idea初装
1.安装插件 Alibaba Java Coding Guidelines Free Mybatis plugin MyBatis Log Plugin Lombok pluginGsonFormat ...
- Django视图系统
Django的view(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. ...
- js和jq中常见的各种位置距离之offset和offset()的区别(三)
offsetLeft:元素的边框的外边缘距离与已定位的父容器(offsetparent)的左边距离(不包括元素的边框和父容器的边框). offset().left:返回的是相对于当前文档的坐标,使用o ...