Tomcat的管道

简介: Tomcat中按照包含关系一共有四个容器——StandardEngine、StandardHost、StandardContext和StandardWrapper,对这四个容器的详细解析后面会涉及,请求对象及响应对象将分别被此四个容器处理,请求响应对象在四个容器之间通过管道机制进行传递。

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);

        统计处理时间

    }


点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
人工智能 监控 中间件
魔搭开源版GPTS来啦!轻松搭建个人超级智能体!
Openai DEV day上推出了GPT Stores, 允许用户通过聊天、直接配置的方式进行GPT的定制
阿里云AMQP Springboot集成
本文主要介绍如何通过 Spring boot 连接阿里云AMQP服务。
3584 0
|
12月前
|
Oracle 大数据 数据挖掘
企业内训|大数据产品运营实战培训-某电信运营商大数据产品研发中心
本课程是TsingtaoAI专为某电信运营商的大数据产品研发中心的产品支撑组设计,旨在深入探讨大数据在电信运营商领域的应用与运营策略。通过密集的培训,从数据的本质与价值出发,系统解析大数据工具和技术的最新进展,深入剖析行业内外的实践案例。课程涵盖如何理解和评估数据、如何有效运用大数据技术、以及如何在不同业务场景中实现数据的价值转化。
203 0
|
iOS开发
解决Error (Xcode): File not found:XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
解决Error (Xcode): File not found:XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
344 0
|
10月前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
260 3
|
XML JSON 网络协议
【TCP/IP】自定义应用层协议,常见端口号
【TCP/IP】自定义应用层协议,常见端口号
292 3
|
Java Linux Android开发
给TV添加一个投屏热键:基于MTK9269 android 9.0
本文介绍了在基于MTK9269 Android 9.0系统的电视上添加投屏热键的方法,包括配置红外遥控器按键映射、在PhoneWindowManager.java中添加按键响应代码,以及创建一个接收Intent的Android应用程序来处理热键触发的动作。
454 1
给TV添加一个投屏热键:基于MTK9269 android 9.0
|
数据采集 前端开发 数据可视化
程序员必知:基于氚云平台的应用开发学习(一)
程序员必知:基于氚云平台的应用开发学习(一)
516 0
|
算法
【计算机网络】MAC层(二)和Collision相关的协议
在争用期,冲突带来的影响也会很巨大。本文将讨论以下三部分的协议:无冲突协议(collision-free protocol)、有限争用协议(limited-contention protocol)以及无线局域网协议。
783 0
|
存储 缓存 负载均衡
无类别域间路由 (CIDR):Internet 地址分配和聚合计划
本备忘录讨论了现有 32 位 IPv4 地址空间的地址分配策略,以保护地址空间并限制全局路由状态的增长率。本文档废弃了 RFC 1519 中的原始无类别域间路由 (Classless Inter-domain Routing,CIDR) 规范,进行了更改以阐明其引入的概念,并在 12 年多之后更新 Internet 社区关于部署所描述技术的结果。
618 0
无类别域间路由 (CIDR):Internet 地址分配和聚合计划