内存马基础知识
javaweb三大组件
java web:Servlet,Filter,Listener
三大组件的各自功能:
- Servlet:用我的话来讲它就像是一个处理器,它会接受http请求然后把他封装成 HttpServletRequest 和HttpServletResponse 对象,然后进行处理
- Filter:这是一个双向的拦截器吧,为什么叫双向?它会在request到达servlet之前处理一遍,然后servlet发送response之后到达客户端之前处理一遍,也就像是在客户端和servlet中间的代理一样都要走它哪里走一遍
- Listener。Application、Session 和 Request 三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件,有一个直白一点的解释:
- 事件:一件事情
- 事件源:事件发生的地方
- 监听器:一个对象
- 注册监听:将事件源,事件,监听器,绑定在一起。当事件源上发生某件事情的时候,执行监听器代码
tomcat架构
Tomcat功能
从最开始Tomcat的介绍来看,Tomcat有点像一个Servlet官方一点就是:Tomcat 是 Web 应用服务器,是一个 Servlet/JSP 容器,而 Servlet 容器从上到下分别是 Engine、Host、Context、Wrapper。
顶层架构
来一张顶层架构图
Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:
1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;
一个tomcat只能启动一个server但是可以有多个service,,一个Service只有一个Container,但是可以有多个Connectors,代表的就是一个service运行有多个连接
多个connector和一个Container行成一个service,service就可以向提供服务了,但是service是可以有多个的所以就需要有东西来控制service的生产周期,跟k8s的架构有些类似类似在k8s中的(Kubelet 负责维护容器的生命周期)
connecter
作为Tomcat的核心组件之一,它是用来接受客户端发送的请求然后把它一个 Request 和 Response 对象分别用于和请求端交换数据(这里转换的不是Servletrequest()和ServletResponse)
socket 通信
解析处理应用层协议,如将 socket 连接封装成 request 和 response 对象,后续交给 Container 来处理
将 Request 转换为 ServletRequest,将 Response 转换为 ServletResponse
Adapter 组件
由于协议的不同,Tomcat 定义了自己的 Request 类来存放请求信息,但是这个不是标准的 ServletRequest。于是需要使用 Adapter 将 Tomcat Request 对象转成 ServletRequest 对象,然后就能调用容器的 service 方法。
这个组件的作用就是把tomcat的特有的request转化成Servlet的Sservletreques。
Adapter 组件的结构图
Container组件
Container(又名Catalina)用于处理Connector发过来的servlet连接请求,它是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。
Tomcat 设计了 4 种容器: Engine、Host、Context、Wrapper
,这四种容器是父子关系
- Engine: 最顶层容器组件,可以包含多个 Host。实现类为
org.apache.catalina.core.StandardEngine
- Host: 代表一个虚拟主机,每个虚拟主机和某个域名 Domain Name 相匹配,可以包含多个 Context。实现类为
org.apache.catalina.core.StandardHost
- Context: 一个 Context 对应于一个 Web 应用,可以包含多个 Wrapper。实现类为
org.apache.catalina.core.StandardContext
- Wrapper: 一个 Wrapper 对应一个 Servlet。负责管理 Servlet ,包括 Servlet 的装载、初始化、执行以及资源回收。实现类为
org.apache.catalina.core.StandardWrapper
Tomcat的类加载机制
由于 Tomcat 中有多个 WebApp 同时要确保之间相互隔离,所以 Tomcat 的类加载机制也不是传统的双亲委派机制。
Tomcat 自定义的类加载器 WebAppClassloader 为了确保隔离多个 WebApp 之间相互隔离,所以打破了双亲委托机制。每个 WebApp 用一个独有的 ClassLoader 实例来优先处理加载。它首先尝试自己加载某个类,如果找不到再交给父类加载器,其目的是优先加载 WEB 应用自己定义的类。
同时为了防止 WEB 应用自己的类覆盖 JRE 的核心类,在本地 WEB 应用目录下查找之前,先使用 ExtClassLoader(使用双亲委托机制)去加载,这样既打破了双亲委托,同时也能安全加载类。
这一点在CommonsBeanutils1链中就有体现,就是它tomcat有自己的
小结
(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;