1.一文详解Tomcat Ghostcat-AJP协议文件读取/文件包含漏洞CVE-2020-1938
2.从源码剖析SpringBoot中Tomcat的源码默认最大连接数
3.linux环境部署tomcat(自用)
4.Web中间件漏洞之Tomcat篇
5.Tomcat源码分析— Bootstrap启动流程
6.Tomcat处理http请求之源码分析 | 京东云技术团队
一文详解Tomcat Ghostcat-AJP协议文件读取/文件包含漏洞CVE-2020-1938
文章首发于先知社区:xz.aliyun.com/t/
零基础慎入,因为一不小心你就看懂了。版本
以tomcat 8.5.版本为例进行漏洞分析,源码首先下载tomcat源码: monLoader。版本完成初始化后,源码预加载tomcat和javax包下的版本小程序cps源码自定义类,避免访问权限异常。源码
调用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的spring mvc源码解读初始化流程将在后续文章中单独讲解。
Bootstrap类的main方法通过反射执行catalina实例的start方法,启动standardServer实例,使其监听端口并接收新请求。start方法主要逻辑包括启动Service、Engine容器、Executor执行器、MapperListener监听器、Connector连接器等组件。当启动成功后,创建并监听端口,直播app源码破解Tomcat对外提供服务。
总结,Tomcat的启动流程清晰且依赖模板方法与责任链设计模式,理解这两种模式有助于更好地理解启动过程及代码。启动过程首先初始化各组件,如Server、Service、Engine容器、虚拟主机Host、上下文Context、pos机申请源码Executor执行器、Connector连接器等,然后按顺序启动组件,成功后监听端口提供服务。
Tomcat处理http请求之源码分析 | 京东云技术团队
本文将从请求获取与包装处理、请求传递给 Container、Container 处理请求流程,这 3 部分来讲述一次 http 穿梭之旅。
在 tomcat 组件 Connector 启动时,会监听端口。以 JIoEndpoint 为例,在 Acceptor 类中,socket = serverSocketFactory.acceptSocket (serverSocket); 与客户端建立连接,将连接的 socket 交给 processSocket (socket) 来处理。在 processSocket 中,对 socket 进行包装,交给线程池处理。
线程池中的 SocketProcessor 任务,将 socket 交给 handler 处理,此 handler 为 HttpConnectionHandler 的实例。在 HttpConnectionHandler 的父类 process 方法中,根据请求的状态,创建 HttpProcessor 进行相应的处理,然后切到 HttpProcessor 的父类 AbstractHttpProccessor 中。
在 SocketProcessor 中,从 socket 获取请求数据,进行 keep-alive 处理,数据包装等操作,最终将处理后的请求信息交给了 CoyoteAdapter 的 service 方法。
CoyoteAdapter 的 service 方法中有两个主要任务:一是将 org.apache.coyote.Request 和 org.apache.coyote.Response 转换为继承自 HttpServletRequest 的 org.apache.catalina.connector.Request 和 org.apache.catalina.connector.Response,同时定位到 Context 和 Wrapper。二是将请求交给 StandardEngineValve 处理。
在 postParseRequest 方法中,request 通过 URI 的信息找到属于自己的 Context 和 Wrapper。Mapper 保存了所有的容器信息,初始化时将所有容器添加到了 mapper 中。容器信息的变化由 MapperListener 监听,一旦容器发生变化,MapperListener 将其作为监听者进行处理。
找到请求对应的 Context 和 Wrapper 后,CoyoteAdapter 将包装好的请求交给 Container 处理。从下面的代码片段,我们很容易追踪整个 Container 的调用链,形成时间线图。
最终,StandardWrapperValve 将请求交给 Servlet 处理完成,至此一次 http 请求处理完毕。