Tomcat架构基础

Tomcat

tomcat三大组件:Listener、Filter、Servlet
执行顺序:Listener > Filter > Servlet

Servlet

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
大致位置如下:
image.png

请求处理过程

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class FilterTest implements Filter {  
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//读取web.xml配置信息及初始化操作
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 在这里面进行 doGet 和 doPost 这种类似的
}

@Override
public void destroy() {
//完毕-销毁
}
}

Filter链

当多个 Filter 同时存在的时候,组成了 Filter 链。Web 服务器根据 Filter 在 web.xml 文件中的注册顺序,决定先调用哪个 Filter。当第一个 Filter 的 doFilter 方法被调用时,web服务器会创建一个代表 Filter 链的 FilterChain 对象传递给该方法,通过判断 FilterChain 中是否还有 Filter 决定后面是否还调用 Filter。
image.png

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

image.png
两个核心功能分别对应两个组件:Connector连接器和Container容器
image.png

  • Server
    Server 服务器的意思,代表整个 tomcat 服务器,一个 tomcat 只有一个 Server Server 中包含至少一个 Service 组件,用于提供具体服务。

  • Service
    服务是 Server 内部的组件,一个Server可以包括多个Service。它将若干个 Connector 组件绑定到一个 Container

  • Connector
    称作连接器,是 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 容器。大致如图:
image.png

Container容器

Container组件又称作Catalina,其是Tomcat的核心,后面在分析内存马时将会导入tomcat-catalina分析源码。在Container中,有4种容器,分别是Engine、Host、Context、Wrapper。
image.png
四种容器的作用:

  • 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
image.png

总结

总体大致框架如下:
image.png