Tomcat
tomcat三大组件:Listener、Filter、Servlet
执行顺序:Listener > Filter > Servlet
Servlet
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
大致位置如下:
请求处理过程
Servlet容器接收到请求,根据请求封装成HttpServletRequest和HttpServletResponse对象,用于后续调用Http请求,例如接受传参、处理返回消息。
在一个servlet中存在这样几种方法:
init():servle容器初始化,第一次被调用
service():根据方法请求,调用doGet或doPost方法
doGet、doPost:封装了HttpServletRequest和HttpServletResponse对象,用于逻辑处理程序
destroy():容器销毁时调用
Servlet生命周期
1)服务器启动时 (web.xml 中配置 load-on-startup=1,默认为 0)或者第一次请求该 servlet 时,就会初始化一个 Servlet 对象,也就是会执行初始化方法 init(ServletConfig conf)。
load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用该Servlet的init()方法)。
它的值必须是一个整数,表示servlet被加载的先后顺序。如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。
值相同时,容器就会自己选择顺序来加载。
2)servlet 对象去处理所有客户端请求,在 service(ServletRequest req,ServletResponse res) 方法中执行
3)服务器关闭时,销毁这个 servlet 对象,执行 destroy() 方法。
4)由 JVM 进行垃圾回收。
Filter
filter 也称之为过滤器,是对 Servlet 技术的一个强补充,其主要功能是在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest ,根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据;在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse ,根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。
只要在 Filter.doFilter 方法中调用 FilterChain.doFilter 方法的语句前后增加某些程序代码,这样就可以在 Servlet 进行响应前后实现某些特殊功能。
主要用途为过滤,做wf、字符编码过滤等
Filter需要在web.xml中定义访问拦截路径,Filter.doFilter中有一条FilterChain.doFilter,当他执行完毕会调用Servlet.service()
Filter生命周期
与servlet一样,Filter的创建和销毁也由web容器负责。web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
也就是:init() [读取web.xml配置] –> doFilter() [执行filter逻辑] –> destroy()
大概包含如下信息:
1 | public class FilterTest implements Filter { |
Filter链
当多个 Filter 同时存在的时候,组成了 Filter 链。Web 服务器根据 Filter 在 web.xml 文件中的注册顺序,决定先调用哪个 Filter。当第一个 Filter 的 doFilter 方法被调用时,web服务器会创建一个代表 Filter 链的 FilterChain 对象传递给该方法,通过判断 FilterChain 中是否还有 Filter 决定后面是否还调用 Filter。
Listener
Java Web 开发中的监听器(Listener)就是 Application、Session 和 Request 三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件。
ServletContextListener:对Servlet上下文的创建和销毁进行监听; ServletContextAttributeListener:监听 Servlet 上下文属性的添加、删除和替换;
HttpSessionListener:对 Session 的创建和销毁进行监听。Session 的销毁有两种情况,一个中 Session 超时,还有一种是通过调用 Session 对象的 invalidate() 方法使 session 失效。
HttpSessionAttributeListener:对 Session 对象中属性的添加、删除和替换进行监听;
ServletRequestListener:对请求对象的初始化和销毁进行监听; ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
Listener监听器用于监听客户端的请求和服务端的操作,通常用于监听网站在线人数、统计访问量、访问监控等。
Tomcat架构
tomcat作为一个 Web 服务器,实现了两个非常核心的功能:
- Http 服务器功能:进行 Socket 通信(基于 TCP/IP),解析 HTTP 报文
- Servlet 容器功能:接受Request和返回Response,加载和管理 Servlet
两个核心功能分别对应两个组件:Connector连接器和Container容器
Server
Server 服务器的意思,代表整个 tomcat 服务器,一个 tomcat 只有一个 Server Server 中包含至少一个 Service 组件,用于提供具体服务。Service
服务是 Server 内部的组件,一个Server可以包括多个Service。它将若干个 Connector 组件绑定到一个 ContainerConnector
称作连接器,是 Service 的核心组件之一,一个 Service 可以有多个 Connector,主要连接客户端请求,用于接受请求并将请求封装成 Request 和 Response,然后交给 Container 进 行处理,Container 处理完之后在交给 Connector 返回给客户端。Container
负责处理用户的 servlet 请求Connetor连接器
连接器主要完成以下三个核心功能:
socket 通信,也就是网络编程
解析处理应用层协议,封装成一个 Request 对象
将 Request 转换为 ServletRequest,将 Response 转换为 ServletResponse
以上分别对应三个组件 EndPoint、Processor、Adapter 来完成。Endpoint 负责提供请求字节流给Processor,Processor 负责提供 Tomcat 定义的 Request 对象给 Adapter,Adapter 负责提供标准的 ServletRequest 对象给 Servlet 容器。大致如图:
Container容器
Container组件又称作Catalina,其是Tomcat的核心,后面在分析内存马时将会导入tomcat-catalina分析源码。在Container中,有4种容器,分别是Engine、Host、Context、Wrapper。
四种容器的作用:
- Engine
表示整个 Catalina 的 Servlet 引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine,但是一个引擎可包含多个 Host - Host
代表一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可包含多个 Context - Context
表示一个 Web 应用程序,每一个Context都有唯一的path,一个Web应用可包含多个 Wrapper - Wrapper
表示一个Servlet,负责管理整个 Servlet 的生命周期,包括装载、初始化、资源回收等
实现方式:
- Engine,实现类为 org.apache.catalina.core.StandardEngine
- Host,实现类为 org.apache.catalina.core.StandardHost
- Context,实现类为 org.apache.catalina.core.StandardContext
- Wrapper,实现类为 org.apache.catalina.core.StandardWrapper
如以下图,a.com和b.com分别对应着两个Host
总结
总体大致框架如下: