内存马系列--tomcat基础

学习内存马之前先了解学习 tomcat

一.Tomcat

区分一下 apache&&tomcat&&nginx

Apache 是强大的 Web 服务器,适合处理静态网页(如 html),同时可通过插件支持动态页面。

Tomcat 主要作为应用服务器,是 Servlet/JSP 应用的容器,专注于处理动态网页,如 JSP、Servlet 等;

Nginx 常用作静态内容服务和代理服务器,在静态文件处理和反向代理方面表现出色,也可通过模块开发提供一定的动态功能;

tomcat 总体架构

浏览器发起一个 http 请求,使用 http 协议,http 协议是应用层协议,最终会走到 HTTP 服务器中,而我们的 tomcat 也是一个 http 服务器,因为 tomcat 能够接收并处理 http 请求。

当请求走到 tomcat 后,接收到请求之后把请求交给 Servlet 容器(下面学到它)来处理,Servlet 容器通过 Servlet 接口调⽤业务类。Servlet 接口和 Servlet 容器这⼀整套内容叫作Servlet 规范。因此 tomcat 既有 http 服务器的功能又按照 Servlet 规范实现了 Servlet 容器,所以 tomcat 又是一个 Servlet 容器。

类比 tomcat 和 servlet

Tomcat 是「餐厅」,Servlet 是餐厅里的「厨师」—— 餐厅(Tomcat)负责迎接顾客(接收请求)、安排厨师工作(调用 Servlet)、把菜品交给顾客(返回响应);厨师(Servlet)本身不能独立营业,必须依附餐厅(容器)才能提供服务。

Tomcat 的框架如下图所示,主要有 server、service、connector(连接器组件)、container(容器组件) 四个部分

上面说了 tomcat 是一个 http 服务器也是 servlet 容器,这两个功能,分别对应着 tomcat 的两个核心组件连接器(Connector)和容器(Container),连接器负责对外交流(完成 Http 服务器功能),容器负责内部处理(完成 Servlet 容器功能)


server

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

Service:

  • 服务, 主要是为了关联 Connector 和 Container,同时会初始化它下面的其它组件,在 Connector 和 Container 外面多包一层,把它们组装在一起,向外面提供服务,一个 connector 对应一个请求,所以一个 Service 可以设置多个 Connector,但只能有一个 Container 容器。

connector 连接器

连接器主要完成以下三个核心功能:

socket 通信,也就是网络编程

解析处理应用层协议,封装成一个 Request 对象

将 Request 转换为 ServletRequest,将 Response 转换为 ServletResponse

以上功能分别对应三个组件 EndPoint、Processor、Adapter 来完成。Endpoint 负责提供请求字节流给 Processor,Processor 负责提供 Tomcat 定义的 Request 对象给 Adapter,Adapter 负责提供标准的 ServletRequest 对象给 Servlet 容器。


container 容器

Container 是容器的父接口,用于封装和管理 Servlet,以及具体处理 Request 请求,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是 Engine、Host、Context、Wrapper。这四个组件是父子关系,存在包含关系。

容器 描述
Engine 表示整个 Cataline 的 Servlet 引擎(管理多个虚拟站点)
Host 代表一个虚拟主机/站点
Context 代表一个 Web 应用程序
Wrapper 代表一个 Servlet
tomcat 的中的三个 context 的理解

首先说一下之前在 JNDI 中见到过 xxcontext,与这里的不一样,它在每个服务 RMI/LDAP 都有一个对应的上下文 context,都会走到对应上下文的 lookup。

JNDI Context 是一种命名/目录服务的访问接口

tomcat 中的 context 代表 Web 应用程序

ServletContext是 Servlet 规范中规定的 ServletContext 接口,一般 servlet 都要实现这个接口。大概就是规定了如果要实现一个 WEB 容器,他的 Context 里面要有这些东西:获取路径,获取参数,获取当前的 filter,获取当前的 servlet 等

ApplicationContext,在 Tomcat 中,ApplicationContext 实现了 ServletContext 规范,因为门面模式的原因,实际套了一层 ApplicationContextFacade。关于什么是门面模式具体可以看JAVA 设计模式之门面模式(外观模式) | 菜鸟教程,简单来讲就是加一层包装。

实现的一些方法例如 addServlet,addFilter 等

StandardContext存在于 org.apache.catalina.core.StandardContext。

ApplicationContext 所实现的方法其实都是调用的 standardContext 中的方法

所以看上面这张图也能看出来,对容器 Context 中的资源进行操作时,最终调用的是 StandardContext 中的方法,因此 StandardContext 是 Tomcat 中负责与底层交互的 Context。


二.web 三大组件

Java Web 的三大核心组件是 Servlet、Filter(过滤器)、Listener(监听器),它们是构建 Java Web 应用的基础。三者的加载顺序为 Listener->Filter->Servlet

Servlet

什么是 Servlet

它是用 Java 编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。

下图是它在 web 应用程序中的位置

更准确地说,Servlet 位于 tomcat 的 container 容器层次结构的最底层 —— **Wrapper**** 容器** 中。

Servlet API

···

调用流程:

客户端发起 http 请求,比如 get 类型

服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器

Servlet 容器接收到请求,根据请求信息,封装为HttpServletRequestHttpServletResponse对象,这就是我们的传参

Servlet 容器调用HttpServlet的 init 方法初始化,init 方法旨在第一次请求时被调用

Servlet 容器调用service方法

方法根据请求类型(这里为 get 请求),分别调用doGet<或者doPost方法,这里我们调用doGet方法

doXXX方法中是我们自己写的业务逻辑

业务逻辑处理完成,返回给 Servlet 容器,然后容器将结果返回给客户端

容器关闭时,会调用destory方法

整个调用流程的代码就是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package tomcatShell.Servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

// 基础恶意类
@WebServlet("/servlet")
public class ServletTest implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {

}

@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

Filter

当客户端发送请求到服务器时,请求首先会经过一系列的 Filter。每个 Filter 可以对请求进行检查和修改,然后将请求传递给下一个 Filter 或目标资源。当目标资源处理完请求后,响应会按照相反的顺序再次经过这些 Filter,每个 Filter 可以对响应进行后处理,最后将响应返回给客户端。

Filter 介入的是 请求到达 Servlet 之前响应返回客户端之前

结合上面 tomcat 架构,因为 Servlet 是 container 中 Wrapper 层级 的资源;Filter 属于 container 中 Context 层级资源,可以在请求到达某个 Servlet 之前/相应返回客户端之前拦截它。

实现 Filter 接口:编写一个 Java 类,实现 javax.servlet.Filter 接口,并重写其中的三个方法:init()``doFilter()<font style="color:rgb(51, 51, 51);"> 和 </font>destroy()`

  • init():在 Filter 实例创建后调用,用于初始化资源。
  • doFilter():对请求和响应进行处理,是 Filter 的核心方法。
  • destroy():在 Filter 实例销毁前调用,用于释放资源。

配置 Filter 的拦截路径有 2 种方式,一种是注解,一种是xml方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package EvilFliter;

import javax.servlet.*;
import java.io.IOException;

public class FilterTest implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

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

@Override
public void destroy() {

}
}

listener

Java Web 开发中的监听器(Listener)就是 Application、Session 和 Request 三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件。

ServletContextListener:对 Servlet 上下文的创建和销毁进行监听; ServletContextAttributeListener:监听 Servlet 上下文属性的添加、删除和替换;

HttpSessionListener:对 Session 的创建和销毁进行监听。Session 的销毁有两种情况,一个中 Session 超时,还有一种是通过调用 Session 对象的 invalidate() 方法使 session 失效。

HttpSessionAttributeListener:对 Session 对象中属性的添加、删除和替换进行监听;

ServletRequestListener:对请求对象的初始化和销毁进行监听; ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。

参考文章:

https://drun1baby.top/2022/08/21/Java%E5%86%85%E5%AD%98%E9%A9%AC%E7%B3%BB%E5%88%97-02-%E5%86%85%E5%AD%98%E9%A9%AC%E4%BB%8B%E7%BB%8D/#ApplicationContext

https://www.cnblogs.com/haimishasha/p/10740606.html

https://github.com/Y4tacker/JavaSec/blob/main/5.%E5%86%85%E5%AD%98%E9%A9%AC%E5%AD%A6%E4%B9%A0/Tomcat/Tomcat%E4%BB%8B%E7%BB%8D/Tomcat%E4%BB%8B%E7%BB%8D.md


内存马系列--tomcat基础
https://bxhhf.github.io/2025/11/05/yuque-hexo-post/内存马系列--tomcat基础/
作者
bxhhf
发布于
2025年11月5日
许可协议