Tomcat的管道
Tomcat中按照包含关系一共有四个容器——StandardEngine、StandardHost、StandardContext和StandardWrapper,对这四个容器的详细解析后面会涉及,请求对象及响应对象将分别被此四个容器处理,请求响应对象在四个容器之间通过管道机制进行传递。如下图,请求响应对象先通过StandardEngine的管道,期间经过若干个阀门处理,基础阀门是StandardEngineValve;往下流转到StandardHost的管道,基础阀门为StandardHostValve;类似地通过StandardContext;最后到StandardWrapper完成整个处理流程。
这种设计为每个容器都带来了灵活的机制,可以按照需要对不同容器添加自定义阀门进行不同的逻辑处理,并且tomcat将管道机制做成可配置形式,对于存在的阀门只需通过配置文件即可,还可以自定义阀门并配置就可在相应作用域内生效。四个容器中每个容器都包含自己的管道对象,管道对象用于存放若干阀门对象,他们都有自己的基础阀门,且基础阀门是tomcat默认设置的,一般不可更改之,以免运行时产生问题。
下面分别看看这些基础阀门详细的解析
① StandardEngineValve,此阀门最重要的逻辑如下,调用时它会获取请求对应的主机host对象,同时负责调用host对象中管道的第一个阀门。
public final voidinvoke(Request request, Response response)
throws IOException, ServletException {
Host host = request.getHost();
host.getPipeline().getFirst().invoke(request, response);
}
② StandardHostValve,尽管包含了其他的处理逻辑,但不可缺少的逻辑是获取请求对应的上下文context对象并调用context对象中管道的第一个阀门。
public final voidinvoke(Request request, Response response)
throws IOException, ServletException {
Context context = request.getContext();
触发request初始化事件
context.getPipeline().getFirst().invoke(request, response);
更新会话上次访问时间
}
③ StandardContextValve,上下文基础阀门先会判断是否访问了禁止目录WEB-INF或META-INF,接着获取请求对应的wrapper对象,再向客户端发送通知报文“HTTP/1.1 100 Continue”,最后调用wrapper对象中管道的第一个阀门。
public final voidinvoke(Request request, Response response)
throws IOException, ServletException {
判断访问路径是否包含WEB-INF或META-INF,禁止访问此目录
Wrapper wrapper = request.getWrapper();
向客户端发送"HTTP/1.1 100 Continue"通知
wrapper.getPipeline().getFirst().invoke(request, response);
}
④ StandardWrapperValve,包装器基础阀门负责统计请求次数、统计处理时间、分配Servlet内存、执行servlet过滤器、调用Servlet的service方法、释放Servlet内存。
public final voidinvoke(Request request, Response response)
throws IOException, ServletException {
统计请求次数
StandardWrapper wrapper =(StandardWrapper) getContainer();
Servlet servlet = wrapper.allocate();
执行servlet的过滤器
servlet.service(request, response);
wrapper.deallocate(servlet);
统计处理时间
}
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
Tomcat的管道的更多相关文章
- 75篇关于Tomcat源码和机制的文章
75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报 分类: tomcat内核(82) 版权声明:本文为 ...
- tomcat 组件研究二--请求过程
上一篇博客大概总结了tomcat 的组件以及其组织方式,对于tomcat 的启动过程也进行进行了简单的总结,下面这篇博客,继续研究tomcat 处理请求的相关组件,其实就是主要研究Connectors ...
- Tomcat源码分析——请求原理分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
- Tomcat详解系列(2) - 理解Tomcat架构设计
Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...
- Tomcat详解系列(3) - 源码分析准备和分析入口
Tomcat - 源码分析准备和分析入口 上文我们介绍了Tomcat的架构设计,接下来我们便可以下载源码以及寻找源码入口了.@pdai 源代码下载和编译 首先是去官网下载Tomcat的源代码和二进制安 ...
- TOMCAT8源码分析——处理请求分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
- 浅读tomcat架构设计之Pipeline-Valve管道(4)
tomcat Container容器处理请求是使用Pipeline-Valve管道来处理的,后续写的tomcat内存马,和他紧密结合 Pipeline-Valve是责任链模式,责任链模式是指在一个请求 ...
- Linux下通过管道杀死所有与tomcat相关的进程
先将正确的命令放上来: ps -ef | grep ps -ef将系统中运行的进程展示出来 选择带有tomcat的进程后同时去除自身带有grep的进程,毕竟本身运行的这条命令是与tomcat相关的 a ...
- Oracle死锁导致的tomcat抛损坏的管道异常
今天遇到个问题,就是由于清空数据库的数据,设备采集客户端一直在往服务器上发采集回来的数据,但是由于某种原因,数据库的某语句死锁了. 数据库的死锁语句是通过这个SQL查出来的:select sql_te ...
随机推荐
- Hibernate中Session之get和load方法的真正区别
最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...
- 在vue生命周期中及时销毁全局作用的代码
一.纯客户端中 对于全局的代码,比如定时器等,在 beforeDestroy或 destroyed 生命周期时将其销毁.如果在跳转路由时候,组件销毁了,全局的定时器却没有销毁,这会使得页面产生卡顿. ...
- html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结
Day27 html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...
- PHP While 循环
PHP 循环 - While 循环 循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块. PHP 循环 在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行.我们可以在代码中使用循 ...
- Docker仓库
仓库是集中存放镜像文件的场所.有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分.实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(t ...
- 一些有用的Java参考资料
Better Java,一些好的Java实践 Google Java Style Guide 30个Java编程技巧 JDK8新增语法特性简介,对Java8中新增的函数接口.Lambda表达式.方法引 ...
- RunLoop总结:RunLoop的应用场景(五)
今天要介绍的RunLoop应用场景感觉很酷炫,我们可能不常用到,但是对于做Crash 收集的 SDK可能会用得比较频繁吧.相比关于RunLoop 可以让应用起死回生,大家都听说过,可是怎么实现呢?今天 ...
- 六星经典CSAPP-笔记(12)并发编程(上)
六星经典CSAPP-笔记(12)并发编程(上) 1.并发(Concurrency) 我们经常在不知不觉间就说到或使用并发,但从未深入思考并发.我们经常能"遇见"并发,因为并发不仅仅 ...
- Quartz学习笔记1:Quartz概述
Quartz是开源任务调度框架中的翘楚,它提供了强大的 任务调度机制.Quartz允许开发人员灵活的定义触发器的调度时间表,并可对触发器和任务进行关联映射.此外,Quartz提供了调度运行环境的持久化 ...
- Python logging 模块和使用经验
记录下常用的一些东西,每次用总是查文档有点小麻烦. py2.7 日志应该是生产应用的重要生命线,谁都不应该掉以轻心 有益原则 级别分离 日志系统通常有下面几种级别,看情况是使用 FATAL - 导致程 ...