1.Tomcat源码分析— Bootstrap启动流程
2.Tomcat处理http请求之源码分析 | 京东云技术团队
3.从源码角度分析Tomcat的加载acceptCount、maxConnections、源码源码maxThreads参数
4.Servlet源码和Tomcat源码解析
5.一文详解Tomcat Ghostcat-AJP协议文件读取/文件包含漏洞CVE-2020-1938
6.springboot如何启动内置tomcat?(源码详解)
Tomcat源码分析— Bootstrap启动流程
在探讨Tomcat启动流程之前,类加需要理解其组件及其周期状态,载器这为后续深入学习组件初始化与启动等提供了基础。加载
实现Lifecycle接口的源码源码android app ui源码组件拥有种状态。Bootstrap作为Tomcat启动入口类,类加负责构造类加载器以加载Catalina内部类,载器通过查找catalina.home目录下所有jar包,加载确保安全地加载应用程序类。源码源码
通过Bootstrap的类加main方法启动Tomcat实例,主要步骤包括创建Bootstrap对象、载器调用init方法,加载并根据启动参数执行load和start方法。源码源码
Bootstrap的类加init方法初始化类加载器,使得Tomcat能加载应用程序类,同时设置当前线程上下文加载器为CatalinaLoader。initClassLoaders方法创建三种类加载器,其中catalinaLoader与sharedLoader的父加载器为commonLoader。完成初始化后,预加载tomcat和javax包下的自定义类,避免访问权限异常。
调用catalinaLoader加载器加载Catalina类,通过反射实例化对象,并设置sharedLoader实例作为入参,最后将实例化的Catalina对象赋予catalinaDaemon成员变量。
Tomcat组件的初始化主要在load方法中完成,通过反射调用Catalina的load方法,构建并初始化StandardServer及其子组件。Bootstrap.load方法通过反射调用Catalina的load方法,Catalina的load方法实现序列图中的逻辑,初始化配置文件解析器Digester,餐厅溯源码制作构建standardServer实例,绑定当前catalina实例,设置根路径,并调用init方法完成初始化。
Tomcat中的容器或组件使用模板方法设计模式,子类通过重写LifecycleBase抽象类的模板方法initInternal实现初始化逻辑。LifecycleBase的init方法主要完成两件事:调用父类的LifecycleBase#init方法,由standerServer#initInternal方法执行实际初始化。init方法逻辑包括:执行LifecycleBase#initInternal抽象方法,由standardServer#initInternal方法完成初始化。
service组件的init方法主要初始化Connector连接器,连接器的初始化尤为重要。不同协议处理器如AjpAprProtocol、HttpNioProtocol的初始化流程将在后续文章中单独讲解。
Bootstrap类的main方法通过反射执行catalina实例的start方法,启动standardServer实例,使其监听端口并接收新请求。start方法主要逻辑包括启动Service、Engine容器、Executor执行器、MapperListener监听器、Connector连接器等组件。当启动成功后,创建并监听端口,Tomcat对外提供服务。
总结,Tomcat的启动流程清晰且依赖模板方法与责任链设计模式,理解这两种模式有助于更好地理解启动过程及代码。启动过程首先初始化各组件,如Server、Service、刷网的源码Engine容器、虚拟主机Host、上下文Context、Executor执行器、Connector连接器等,然后按顺序启动组件,成功后监听端口提供服务。
Tomcat处理/t/
零基础慎入,因为一不小心你就看懂了。
以tomcat 8.5.版本为例进行漏洞分析,首先下载tomcat源码: http://archive.apache.org/dist/tomcat/tomcat-8/v8.5./src/apache-tomcat-8.5.-src.zip。搭建过程可以参考这篇Paper: Tomcat源码编译(IDEA)_Java_ww0peo的博客-CSDN博客。
通过浏览器访问 .0.0.1:会报错误。解决办法是IDEA中找到org.apache.catalina.startup.ContextConfig,增加如下的一行代码,将JSP解析器初始化。随后再次启动Tomcat,浏览器就能正常看到Tomcat的主页了。查看端口开放的开放情况,Tomcat运行开启了和端口。
Tomcat的Connector组件的主要职责就是负责接收客户端连接和客户端请求的处理加工。每个Connector会监听一个指定端口,分别负责对请求报文的解析和响应报文组装,解析过程封装Request对象,而组装过程封装Response对象。如果把Tomcat比作一个城堡,那么Connector组件就是城堡的城门,为进出城堡的人们提供通道。
Tomcat组件相关的配置文件是在conf/server.xml,配置文件中每一个元素都对应了Tomcat的一个组件。HTTP Connector很好理解,开源麻将源码 github通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器;AJP Connector是通过AJP协议和一个Web容器进行交互。在将Tomcat与其他HTTP服务器(一般是Apache)集成时,就需要用到这个连接器。AJP协议是采用二进制形式代替文本形式传输,相比HTTP这种纯文本的协议来说,效率和性能更高,也做了很多优化。
浏览器只支持HTTP协议,并不能直接支持AJP协议。所以实际情况是,通过Apache的proxy_ajp模块进行反向代理,暴露成http协议(端口)给客户端访问。
Servlet意为服务程序,也可简单理解为是一种用来处理网络请求的一套规范。主要作用是给上级容器(Tomcat)提供doGet()和doPost()等方法,其生命周期实例化、初始化、调用、销毁受控于Tomcat容器。Tomcat中Servlet的配置是在conf/web.xml。所有请求进入tomcat,都会流经servlet。由注释可以很明显看出,如果没有匹配到任何应用指定的servlet,那么就会流到默认的servlet(即DefaultServlet ),而 JspServlet 负责处理所有JSP文件的请求。
Tomcat内部处理请求的流程第一次看可能觉得会有点复杂。理解了上文的基础,下面开始分析漏洞。这个漏洞主要是风吹雨云商城源码通过AJP协议(端口)触发。通过构造两个不同的请求,经过tomcat内部处理流程,一个走default servlet,另一个走 jsp servlet,可导致不同的漏洞:文件读取漏洞和文件包含漏洞。
文件读取漏洞走的是DefaultServlet,文件包含漏洞走的是JspServlet。下面开始逐一进行分析,测试使用的POC如下:YDHCUI/CNVD---Tomcat-Ajp-lfi。
文件读取漏洞中,通过构造AJP协议请求,我们可以读取到 WEB-INF/web.xml文件。关键点在于request对象中的三个参数:/WEB-INF/web.xml的路径被传入到getRelativePath()方法中,该方法会返回请求的资源路径。随后,通过validate()方法和normalize()方法进行参数校验,确保请求路径中不能包含"/../",从而限制只能读取webapps目录下的文件。
文件包含漏洞(可致RCE)与文件读取漏洞不同,请求经过AjpProcessor类的处理后,将请求转发给了JspServlet。通过构造特定的请求url,可以将任意文件包含到jsp页面中,造成远程代码执行的条件。关键点在于将请求url设置为特定格式,以触发Tomcat处理jsp文件的流程,进而执行包含的文件内容。
针对此漏洞,官方发布的9.0.版本的修复代码主要做了以下几点修复:强制AJP协议默认监听本地环回地址,而不是0.0.0.0;若使用AJP协议,设置secretRequired属性为true,强制配置secret来设置AJP协议认证凭证;配置属性白名单,若向AJP连接器发送任意未被识别的属性,都会响应错误。
总结:文章详细解析了Tomcat Ghostcat漏洞的原理、漏洞分析、修复方法,以及相关的基础知识,为读者提供了一次全面的学习体验。
springboot如何启动内置tomcat?(源码详解)
SpringBoot项目启动时,无需依赖传统Tomcat,因为内部集成了Tomcat功能。本文将深入解析SpringBoot如何通过源码启动内置Tomcat。
关键点在于`registerBeanPostProcessors`的`onRefresh`方法,它扩展了容器对象和bean实例化过程,确保单例和实例化完成。`initApplicationEventMuliticaster`则注册广播对象,与`applicationEvent`和`applicationListener`紧密相关。
文章的核心内容集中在`onRefresh()`方法,其中`createWenServer()`是关键。当`servletContext`和`webServer`为空时,会创建并初始化相关的组件,如`servletWebServerFactory`、`servletContext`(Web请求上下文)、`webServer`(抽象的web容器封装)和`WebServer`实例。`getWebServer()`方法允许在Spring容器刷新后连接webServer。
SpringBoot通过`TomcatServletWebServerFactory`获取webServer,该工厂负责创建和配置webServer,包括Tomcat组件的初始化,如`Connector`和`Context`的设置,以及与wrapper、engine、service和host等的关联。`new Connector`会根据传入的协议进行定制化配置。
理解了这些扩展点,用户可以自定义配置,通过`ServerProperties`或自定义`tomcatConnectorCustomizers`和`tomcatProtocolHandlerCustomizers`来扩展Tomcat的连接器和协议处理器。这就是SpringBoot设计的巧妙之处。
最后,SpringBoot的启动流程涉及逐层初始化和启动Tomcat的组件,如engine、context和wrapper,它们通过生命周期方法如`init`、`start`和`destroy`协同工作。启动过程本质上是一个链式调用,每个组件的初始化和启动都会触发下一层组件的逻辑。
张图解析Tomcat运行原理与架构全貌💥通宵爆肝
早年间,小菜同学在Tomcat上通过继承HttpServlet进行CRUD操作,后来引入Spring MVC框架的DispatcherServlet,使操作更加便捷。现今,随着Spring Boot框架的内嵌,小菜能够更专注地进行CRUD操作,而无需过多关注服务器和框架的细节。保持专一原则,小菜对服务器和框架始终保持谨慎态度。 某日,小菜的程序突然无法运行,面对困境,小菜并未选择“逃跑”,而是决定深入研究中间件的运行原理,通过层层解析,逐步揭开了Tomcat等中间件的核心设计。架构解析
Tomcat作为Java实现的Web服务器,是Java Web开发中流行的选择之一。本文作为解析Tomcat系列的第一篇,将带你深入探索Tomcat的运行流程,揭示其高效设计的核心组件。 处理网络请求是Web服务器的基础,Tomcat也不例外,从网络通信到业务处理,每个步骤都精心设计,以实现高效运行。连接器
处理网络通信的连接器是Tomcat的重要组成部分,它负责获取Socket、解析协议以及封装请求/响应等关键任务。具体实现包括EndPoint、Processor和ProtocolHandler。EndPoint
EndPoint负责点对点的通信,通过Socket处理网络通信。尽管在Tomcat 9中并未直接提供接口,而是通过抽象类实现,实际上提供了两种具体实现:用于不同IO模型的EndPoint。Processor
Processor组件负责解析协议,将网络流解析为Tomcat封装的请求和响应对象。通过不同的实现类,如AbstractProcessor、UpgradeProcessorBase,Tomcat能够支持HTTP、AJP等协议。ProtocolHandler
ProtocolHandler将动态变化的EndPoint和Processor组合起来,负责网络通信的Socket获取和流解析。虽然在设计上采用继承的方式,但实际应用中,只有四个组合实现。Adapter
Adapter组件作为适配器,将Processor解析得到的请求/响应转化为Servlet中定义的格式,便于后续容器的处理。虽然实现相对固定,但其作用至关重要。线程池
多路复用IO模型下,线程池用于管理监听任务和后续处理任务,确保高效执行。尽管EndPoint涉及线程池,但Tomcat实现的线程池并非JUC下的标准实现。多连接器
尽管Tomcat支持多个不同连接器的并行处理,但实际应用中通常使用默认配置,如HTTP、NIO和端口。增加连接器时,端口和协议将自动匹配处理。容器
容器层设计为多级父子结构,包括Engine、Host、Context和Wrapper,实现灵活扩展和高效管理。每个层次的容器通过标准实现和扩展实现,提供稳定的运行环境。Mapper
Mapper组件负责请求路由,解析HTTP请求并将其映射到相应的容器层。在多级容器中,Mapper组件通过map方法解析请求,简化了路由逻辑。PipeLine-Valve
为了实现灵活扩展,Tomcat使用PipeLine和Valve组件构建职责链模式,每层容器从First开始,到Basic结束,实现高效且可扩展的请求处理流程。其他组件
除了核心组件,Tomcat还提供类加载器、session管理器等辅助组件,用于维护Web服务器的正常运行。每个组件都精心设计,确保系统的稳定性和高效性。 在Tomcat的设计中,从连接器到容器,再到其他辅助组件,都体现了面向对象设计原则和现代软件架构的最佳实践,如职责链模式、观察者模式等,使得系统在复杂环境中保持高效稳定。 本文仅概要介绍了Tomcat的核心架构和主要组件,未来将深入源码分析,全面解析Tomcat的运行原理。关注专栏,持续了解更多精彩内容。2024-12-24 11:18
2024-12-24 10:47
2024-12-24 10:33
2024-12-24 10:32
2024-12-24 09:56
2024-12-24 09:46
2024-12-24 09:26
2024-12-24 08:39