设计模式之责任链模式,以tomcat中的过滤器为例

概述

由一组处理器依次处理某个数据,在处理过程中可能对数据进行修改。

详细

因为程序员相对的对Filter最熟悉,这里类图以filter为例。实际Spring下的Filter会比这个复杂的多,中间隔了很多GenericFilterBean、OncePerRequestFilter等类,这里是简化图

图中包含三类角色:
被处理的对象:request和response,被处理的对象可以是一个可以是多个,Filter中是这一对
过滤器链:负责如下事情

  • 存储所有需要执行的过滤器
  • 过滤器链的开始过滤
  • 通过遍历判断过滤器链是否执行完成

过滤器每次执行完后会返回到过滤器链,过滤器链判断有没有完成。过滤器可以选择不返回过滤器直接return的!

过滤器:负责处理请求和决定是否把请求还给流水线,流水线往下一个节点走。

举一个没有还给流水线的例子:
DefaultLogoutPageGeneratingFilter类

//省略了部分代码
public class DefaultLogoutPageGeneratingFilter extends OncePerRequestFilter {
	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		if (this.matcher.matches(request)) {
			// 走到这个分支的时候是不还的,直接返回了
			renderLogout(request, response);
		}
		else {
			if (logger.isTraceEnabled()) {
				logger.trace(LogMessage.format("Did not render default logout page since request did not match [%s]",
						this.matcher));
			}
			filterChain.doFilter(request, response);
		}
	}
}

时序图:
本时序图假设总共就3个过滤器,其中第二个过滤器的实现类有直接return的条件分支。
所以途中有两个分支,一个分支是继续遍历调用后面的过滤器
一个是直接return
FilterChain的doFilter的伪代码:

private Filter[] filters = 所有的过滤器。
public void doFilter(ServletRequest request,ServletResponse response){
	int n = 过滤器总数;
	int pos = 当前过滤器位置;
	if(pos<n){
	  filters[post++].doFilter(request, response);
	}
}

所以如果FilterChain的doFilter方法不被调用的话,他是不会继续执行下一个过滤器的,因此过滤器本身具备了停止执行后面过滤器的权限,他只要return就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
心理咨询预约管理系统(javaEE)-毕业设计.zip MVC模式,普通Servlet控制器,jsp视图,前台Bootstrap 工具版本:mysql5.7,JDK1.8,Tomcat8.5 主要功能模块 分为三个端:管理员、来访者(需要预约的人),咨询师 管理员端 首页 系统近况(咨询师和注册来访者数量,预约数量) 显示最新的消息、留言和公告(最新十条) 主要功能 咨询师管理(添加、修改、删除,账号激活停用) 来访者管理(账号激活停用) 预约问卷管理(添加、修改、删除) 公共和个人信息模块 消息、公告和留言管理(发送接受消息,发布公告,控制留言显示和隐藏) 个人信息管理(修改基本信息和密码) 咨询师端 首页 显示最新的消息、留言和公告(最新十条) 主要功能 查看预约详情,安排咨询申请(安排咨询时间或驳回) 咨询完毕建立咨询档案 查看所有咨询历史 公共和个人信息模块 消息、公告和留言管理(发送接受消息,查看公告,留言) 个人信息管理(修改基本信息和密码) 来访者端 首页 显示最新的消息、留言和公告(最新十条) 主要功能 发起预约申请,等待安排 在我的及时了解预约状态(待安排、准备咨询、被取消) 查看所有咨询历史 公共和个人信息模块 消息、公告和留言管理(发送接受消息,查看公告,留言) 个人信息管理(修改基本信息和密码) 预约状态变动时邮件和站内消息通知来访者 其他 来访者注册 管理员、咨询师和来访者登录 预约流程 来访者申请预约 来访者向某位咨询师申请预约,并填写预约申请表(期望时间地点和评估问卷) 咨询师安排咨询 处理咨询申请,通过申请安排咨询,取消咨询 咨询档案 咨询完成,咨询师上传咨询档案;每次咨询都会记录(可在我的咨询查看) 来访者评价 咨询完成,来访者对本次咨询进行评价 项目工程文件 src bean是数据库表对应实体类 model包下分别是dao层和service层 servlet下的是公共模块部分,admin,client,doctor分别是三个端对应的控制器 test是测试包,无用 utils.filter过滤器,登录过滤,字符过滤等等 utils.jdbc数据库工具类,配置和得到连接池的连接 utils.mail是邮件模块 utils下的ConfigProperties是读入配置文件,ResultDate和UploadResult分别是请求响应结果和文件上传结果对象,Util封装了常用的工具 config.properties 配置参数,配置邮件发送,文件上传大小类型限制等 pool.properties 是连接池配置文件 WebContext amidn,client,doctor分别是三个端对应的页面 plunge是用到的插件 mutualResource 是js,css样式模版目录 mind_sub.sql是数据库表脚本 数据库名:mind_sub 运行项目 新建数据库mind_sub,运行脚本mind_sub.sql 修改pool.properties的username和password 修改config.properties的邮件服务器为你自己的 HostName ,AuthenticationEmail,AuthenticationPwd (我这里用的qq的) 修改upload_path路径 在要部署的Tomcat修改它的server.xml,在Host标签下 增加一行 <Context docBase="F:\upload" path="/mind_upload" reloadable="true"/> 这是文件和图片上传存放的位置 注意要与你config.propertiesupload_path路径一致

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值