Java 内存马基础知识 —— Tomcat 架构学习
字数 2450 2025-08-12 11:34:18

Tomcat架构与Java Web三大件详解

0x01 Java Web三大核心组件

Servlet

定义
Servlet是运行在Web服务器或应用服务器上的程序,作为HTTP客户端请求与服务器端应用程序之间的中间层。

请求处理流程

  1. 客户端发起HTTP请求
  2. Servlet容器接收请求,封装为HttpServletRequest和HttpServletResponse对象
  3. 容器调用HttpServlet的init()方法(仅第一次请求时调用)
  4. 容器调用service()方法
  5. service()根据请求类型调用doGet()或doPost()
  6. 业务逻辑处理完成后返回结果给容器
  7. 容器关闭时调用destroy()

生命周期

  1. 服务器启动时或第一次请求时初始化(通过web.xml配置load-on-startup)
  2. 处理客户端请求时执行service()方法
  3. 服务器关闭时销毁servlet对象
  4. JVM进行垃圾回收

示例代码

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws IOException, ServletException {
        response.getWriter().write("hello Drunbaby");
    }
}

Filter

定义
过滤器是对Servlet技术的补充,可以在HttpServletRequest到达Servlet之前和HttpServletResponse到达客户端之前进行拦截处理。

工作原理

  1. 实现特殊接口的Java类
  2. 可决定是否将请求传递给Servlet
  3. 容器调用Filter的doFilter()而非直接调用Servlet的service()
  4. 通过FilterChain.doFilter()激活目标Servlet的service()
  5. 可在FilterChain.doFilter()前后添加代码实现特殊功能

关键点

  • 通过web.xml定义路径
  • 多个Filter组成FilterChain,按注册顺序执行
  • 最后一个Filter会执行Servlet.service()

生命周期

  1. Web应用启动时创建Filter实例并调用init()
  2. 处理请求时调用doFilter()
  3. Web应用移除或服务器停止时调用destroy()

示例代码

public class FilterTest implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
        // 处理逻辑
        chain.doFilter(request, response);
    }
    
    @Override
    public void destroy() {}
}

Listener

类型

  1. ServletContextListener:监听Servlet上下文的创建和销毁
  2. ServletContextAttributeListener:监听Servlet上下文属性的变化
  3. HttpSessionListener:监听Session的创建和销毁
  4. HttpSessionAttributeListener:监听Session对象属性的变化
  5. ServletRequestListener:监听请求对象的初始化和销毁
  6. ServletRequestAttributeListener:监听请求对象属性的变化

用途

  • 监听在线用户数量
  • 统计网站访问量
  • 网站访问监控等

0x02 Tomcat基础架构

核心组件

  1. Server

    • 代表整个Tomcat服务器
    • 包含至少一个Service组件
    • 负责管理所有Service的生命周期
  2. Service

    • 关联Connector和Container
    • 一个Service可设置多个Connector,但只有一个Container
    • 标准实现类:StandardService
  3. Connector

    • 负责接收TCP连接请求
    • 创建Request和Response对象
    • 主要功能:
      • Socket通信
      • 解析应用层协议
      • 将Request转换为ServletRequest
  4. Container

    • 处理Connector发来的Servlet请求
    • 采用责任链设计模式
    • 包含四个子容器:Engine、Host、Context、Wrapper

Container层级结构

  1. Engine

    • 最顶层容器
    • 可包含多个Host
    • 实现类:StandardEngine
  2. Host

    • 代表虚拟主机
    • 与域名匹配
    • 可包含多个Context
    • 实现类:StandardHost
  3. Context

    • 对应一个Web应用
    • 可包含多个Wrapper
    • 实现类:StandardContext
  4. Wrapper

    • 对应一个Servlet
    • 负责Servlet的装载、初始化和执行
    • 实现类:StandardWrapper

请求处理流程

  1. EndPoint接收Socket连接
  2. 生成SocketProcessor任务提交到线程池
  3. Processor解析协议生成Tomcat Request对象
  4. 调用Adapter的service方法
  5. 通过责任链将请求传递到容器:
    connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
    

0x03 Tomcat类加载机制

WebAppClassloader

特点

  • 打破双亲委派机制
  • 每个WebApp使用独立的ClassLoader实例
  • 优先尝试自己加载类,找不到再交给父类加载器

安全机制

  • 在本地WEB应用目录查找前,先使用ExtClassLoader加载
  • 防止WEB应用类覆盖JRE核心类

0x04 关键概念总结

  1. Servlet生命周期:init() → service() → destroy()
  2. Filter执行顺序:按web.xml注册顺序组成FilterChain
  3. Tomcat容器层级:Server → Service → Connector/Container → Engine → Host → Context → Wrapper
  4. Wrapper作用:管理Servlet实例(StandardWrapper实现)
  5. 类加载机制:打破双亲委派,优先WebApp自身加载

0x05 内存马相关要点

  1. Filter型内存马

    • 在Filter链最前面添加恶意Filter
    • 通过doFilter()方法执行恶意代码
  2. Servlet型内存马

    • 通过StandardWrapper载入自定义Servlet类
    • 在doGet/doPost中实现恶意逻辑
  3. Listener型内存马

    • 通过监听特定事件触发恶意代码
    • 如ServletContextAttributeListener监听属性变化
Tomcat架构与Java Web三大件详解 0x01 Java Web三大核心组件 Servlet 定义 : Servlet是运行在Web服务器或应用服务器上的程序,作为HTTP客户端请求与服务器端应用程序之间的中间层。 请求处理流程 : 客户端发起HTTP请求 Servlet容器接收请求,封装为HttpServletRequest和HttpServletResponse对象 容器调用HttpServlet的init()方法(仅第一次请求时调用) 容器调用service()方法 service()根据请求类型调用doGet()或doPost() 业务逻辑处理完成后返回结果给容器 容器关闭时调用destroy() 生命周期 : 服务器启动时或第一次请求时初始化(通过web.xml配置load-on-startup) 处理客户端请求时执行service()方法 服务器关闭时销毁servlet对象 JVM进行垃圾回收 示例代码 : Filter 定义 : 过滤器是对Servlet技术的补充,可以在HttpServletRequest到达Servlet之前和HttpServletResponse到达客户端之前进行拦截处理。 工作原理 : 实现特殊接口的Java类 可决定是否将请求传递给Servlet 容器调用Filter的doFilter()而非直接调用Servlet的service() 通过FilterChain.doFilter()激活目标Servlet的service() 可在FilterChain.doFilter()前后添加代码实现特殊功能 关键点 : 通过web.xml定义路径 多个Filter组成FilterChain,按注册顺序执行 最后一个Filter会执行Servlet.service() 生命周期 : Web应用启动时创建Filter实例并调用init() 处理请求时调用doFilter() Web应用移除或服务器停止时调用destroy() 示例代码 : Listener 类型 : ServletContextListener:监听Servlet上下文的创建和销毁 ServletContextAttributeListener:监听Servlet上下文属性的变化 HttpSessionListener:监听Session的创建和销毁 HttpSessionAttributeListener:监听Session对象属性的变化 ServletRequestListener:监听请求对象的初始化和销毁 ServletRequestAttributeListener:监听请求对象属性的变化 用途 : 监听在线用户数量 统计网站访问量 网站访问监控等 0x02 Tomcat基础架构 核心组件 Server : 代表整个Tomcat服务器 包含至少一个Service组件 负责管理所有Service的生命周期 Service : 关联Connector和Container 一个Service可设置多个Connector,但只有一个Container 标准实现类:StandardService Connector : 负责接收TCP连接请求 创建Request和Response对象 主要功能: Socket通信 解析应用层协议 将Request转换为ServletRequest Container : 处理Connector发来的Servlet请求 采用责任链设计模式 包含四个子容器:Engine、Host、Context、Wrapper Container层级结构 Engine : 最顶层容器 可包含多个Host 实现类:StandardEngine Host : 代表虚拟主机 与域名匹配 可包含多个Context 实现类:StandardHost Context : 对应一个Web应用 可包含多个Wrapper 实现类:StandardContext Wrapper : 对应一个Servlet 负责Servlet的装载、初始化和执行 实现类:StandardWrapper 请求处理流程 EndPoint接收Socket连接 生成SocketProcessor任务提交到线程池 Processor解析协议生成Tomcat Request对象 调用Adapter的service方法 通过责任链将请求传递到容器: 0x03 Tomcat类加载机制 WebAppClassloader 特点 : 打破双亲委派机制 每个WebApp使用独立的ClassLoader实例 优先尝试自己加载类,找不到再交给父类加载器 安全机制 : 在本地WEB应用目录查找前,先使用ExtClassLoader加载 防止WEB应用类覆盖JRE核心类 0x04 关键概念总结 Servlet生命周期 :init() → service() → destroy() Filter执行顺序 :按web.xml注册顺序组成FilterChain Tomcat容器层级 :Server → Service → Connector/Container → Engine → Host → Context → Wrapper Wrapper作用 :管理Servlet实例(StandardWrapper实现) 类加载机制 :打破双亲委派,优先WebApp自身加载 0x05 内存马相关要点 Filter型内存马 : 在Filter链最前面添加恶意Filter 通过doFilter()方法执行恶意代码 Servlet型内存马 : 通过StandardWrapper载入自定义Servlet类 在doGet/doPost中实现恶意逻辑 Listener型内存马 : 通过监听特定事件触发恶意代码 如ServletContextAttributeListener监听属性变化