浅读tomcat架构设计之Pipeline-Valve管道(4)
tomcat Container容器处理请求是使用Pipeline-Valve管道来处理的,后续写的tomcat内存马,和他紧密结合
Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程有多个处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完成后将处理后的请求返回,再让下一个处理者继续处理. 简单点来说就是Pipeline就是请求,发起各种请求, Valve用于处理过来的所有请求,你的请求都会走Valve,进行处理检查.
(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,Valve的接口实现类是ValveBase
(2)在上层容器的管道的ValveBase会调用下层容器的管道
ValveBase的子类,有很多,分别有这些:

我着重讲下这四个子类
其中要讲的是这四个类,他们和Context,Engine,Host和Wrapper的请求处理息息相关.
Pipeline-Valve的实现方法:
Pipeline的接口实现类是org.apache.catalina.core.StandardPipeline:
StandardPipeline继承自LifecycleBase,所以StandardPipeline是生命周期类
查看startInternal方法:
protected synchronized void startInternal() throws LifecycleException {
Valve current = this.first;
if (current == null) {
current = this.basic;
}
for(; current != null; current = current.getNext()) {
if (current instanceof Lifecycle) {
((Lifecycle)current).start();
}
}
this.setState(LifecycleState.STARTING);
}
学过数据结构的话,会感到很熟悉,我博客文章之前写过类似的代码,他是个链式结构,遍历所有的Valve并调用start方法,最后设置状态.
stopInternal和destroyInternal方法如下:
protected synchronized void stopInternal() throws LifecycleException {
this.setState(LifecycleState.STOPPING);
Valve current = this.first;
if (current == null) {
current = this.basic;
}
for(; current != null; current = current.getNext()) {
if (current instanceof Lifecycle) {
((Lifecycle)current).stop();
}
}
}
protected void destroyInternal() {
Valve[] valves = this.getValves();
Valve[] arr$ = valves;
int len$ = valves.length;
for(int i$ = 0; i$ < len$; ++i$) {
Valve valve = arr$[i$];
this.removeValve(valve);
}
}
代码和startInternal相似,都是使用current临时变量遍历Valve的所有Valve,destoryInternal是删除所有的valve
Pipeline管道处理请求的实现方法:
Engine,先从ValveBase的子类StandEngineValve类开始org.apache.catalina.core.StandardEngineValve
Pipeline管道调用所包含Valve的invoke来处理请求,invoke方法来处理请求
invoke方法:
public final void invoke(Request request, Response response) throws IOException, ServletException {
Host host = request.getHost();
if (host == null) {
response.sendError(400, sm.getString("standardEngine.noHost", new Object[]{request.getServerName()}));
} else {
if (request.isAsyncSupported()) {
request.setAsyncSupported(host.getPipeline().isAsyncSupported());
}
host.getPipeline().getFirst().invoke(request, response);
}
}

首先通过reuquest获取Host站点,然后调用管道的第一个Valve的invoke方法进行处理
Host,org.apache.catalina.core.StandardHostValve#invoke方法: 
代码太长,截取部分,Host的ValveBase调用的是Context的Pipeline
Context,org.apache.catalina.core.StandardContextValve#invoke方法:

代码太长,截取部分,Context的ValveBase调用的是Wrapper的Pipeline
Wrapper,org.apache.catalina.core.StandardWrapperValve#invoke方法:


代码太长,截取部分,Wrapper是封装Servlet的,ValveBase内部调用的是filterChain来处理请求的
Filter和Servlet的实际处理请求的方法在Wrapper的管道Pipeline->Valve-ValveBase-StandardWrapperValve#invoke方法中调用,Wrapper生命周期是在org.apache.catalina.core.StandardWrapper中调用,因为StandardWrapper继承自ContainerBase,ContainerBase又继承自LifecycleMBeanBase
浅读tomcat架构设计之Pipeline-Valve管道(4)的更多相关文章
- 浅读tomcat架构设计之tomcat容器Container(3)
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html 浅读tomcat架构设计之tom ...
- 浅读tomcat架构设计之tomcat生命周期(2)
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html tomcat通过org.apac ...
- 浅读tomcat架构设计和tomcat启动过程(1)
一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...
- Tomcat详解系列(2) - 理解Tomcat架构设计
Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...
- Tomcat 架构原理解析到架构设计借鉴
Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...
- tomcat架构分析(valve源码导读)
出处:http://gearever.iteye.com 源码面前,了无秘密 ----侯捷 在tomcat架构分析(valve机制)(http ...
- 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招
朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
随机推荐
- Netperf测试技巧
Netperf测试技巧 Netperf测试技巧 1.概况 Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即 ...
- Spring Cloud(Dalston.SR1)
Spring Cloud 示例项目地址:https://github.com/Yanshaoshuai/microservicecloud Eureka 集群搭建 microservicecloud- ...
- Linux进阶之补充知识篇
一.Linux系统的主要特点: 开放性:指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准 多用户:允许多个用户从相同或不同终端上同时使用同一台计算机 多任务:它是指计算机同时执行多个程 ...
- JQuery Ajax 发送请求成功后却接收不到任何响应数据问题
问题描述 使用 JQuery Ajax 向后端服务器发送请求,服务器也收到请求返回了响应数据,但是 Ajax 却收不到任何响应数据. 举例如下: $.ajax({ type: "post&q ...
- java 实现简单的单点登录
https://my.oschina.net/leamon/blog/266711 https://serviceturbo-cloud-cn.huawei.com/serviceturbocloud ...
- 实战|教你用Python玩转Mysql
爬虫采集下来的数据除了存储在文本文件.excel之外,还可以存储在数据集,如:Mysql,redis,mongodb等,今天辰哥就来教大家如何使用Python连接Mysql,并结合爬虫为大家讲解. 前 ...
- Vue&Element 前端应用开发之菜单和路由的关系
我们一般的应用系统,菜单是很多功能界面的入口,菜单为了更好体现功能点的设置,一般都是动态从数据库生成的,而且还需要根据用户角色的不同,过滤掉部分没有权限的菜单:在Vue&Element的纯前端 ...
- 在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理
在NVIDIA(CUDA,CUBLAS)和Intel MKL上快速实现BERT推理 直接在NVIDIA(CUDA,CUBLAS)或Intel MKL上进行高度定制和优化的BERT推理,而无需tenso ...
- 深度学习框架集成平台C++ Guide指南
深度学习框架集成平台C++ Guide指南 这个指南详细地介绍了神经网络C++的API,并介绍了许多不同的方法来处理模型. 提示 所有框架运行时接口都是相同的,因此本指南适用于所有受支持框架(包括Te ...
- mapboxgl 互联网地图纠偏插件(一)
之前写过一个 leaflet 互联网地图纠偏插件,引用插件后一行代码都不用写,就能解决国内互联网地图瓦片的偏移问题. 最近想对 mapboxgl 也写一个这样的插件. 原因是自己发布的OSM矢量瓦片地 ...