Java 内存马基础知识 —— Tomcat 架构学习
字数 2450 2025-08-12 11:34:18
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进行垃圾回收
示例代码:
@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到达客户端之前进行拦截处理。
工作原理:
- 实现特殊接口的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()
示例代码:
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
类型:
- 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方法
- 通过责任链将请求传递到容器:
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);
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监听属性变化