Java内存马基础(1)--三大件基础(Servlet、Filter、Listener)原创
字数 2885 2025-08-19 12:41:54

Java Web 三大件与Tomcat架构详解

1. Java Web 三大件基础

Java Web开发中的三大核心组件是Servlet、Filter和Listener,它们构成了Java Web应用的基础架构。

1.1 Servlet

1.1.1 Servlet简介

Servlet是用Java编写的服务器端程序,用于处理客户端请求并生成动态响应。主要特点包括:

  • 高效:支持缓存和多线程处理
  • 方便:提供大量实用工具例程(解析表单数据、处理Cookie等)
  • 功能强大:基于Java API
  • 可移植性好:跨平台运行

1.1.2 Servlet执行过程

  1. 客户端发送请求至服务器
  2. 服务器遍历web.xml中的url-pattern,找到匹配的Servlet
  3. 执行service()方法,解析请求并匹配对应方法
  4. 生成响应内容并返回给客户端

1.1.3 Servlet核心接口

  • ServletConfig:封装web.xml中对当前Servlet的配置信息
  • ServletContext:代表Servlet运行环境,提供容器信息访问方法
    • setAttribute(name, value)
    • getAttribute(name)
    • removeAttribute(name)
  • ServletRequest:封装客户端请求
  • ServletResponse:封装服务器响应

1.1.4 Servlet生命周期

  1. 初始化阶段(init方法)
    • 服务器启动时或第一次请求时执行
    • 只执行一次
  2. 服务阶段(service方法)
    • 处理所有客户端请求
  3. 销毁阶段(destroy方法)
    • 服务器关闭时执行
    • 只执行一次

1.1.5 Servlet安全风险点

  1. service()方法漏洞

    • SQL注入
    • XSS攻击
    // 不安全示例:直接拼接SQL
    String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
    
  2. 请求参数处理漏洞

    • 路径遍历
    • 命令注入
  3. 会话管理漏洞

    • 会话劫持
    • 会话固定
    // 会话窃取示例
    HttpSession session = request.getSession();
    String sessionId = session.getId();
    sendStolenSessionIdToMaliciousServer(sessionId);
    
  4. 文件上传漏洞

    • 恶意文件上传
    • 服务器端代码执行
    // 不安全文件上传示例
    Part filePart = request.getPart("file");
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
    Files.copy(fileContent, Paths.get("/uploads/" + fileName));
    
  5. 错误处理漏洞

    • 敏感信息泄露
    • 错误页面利用

1.2 Filter

1.2.1 Filter简介

Filter是Servlet技术的补充,用于在请求到达Servlet之前和响应返回客户端之前进行拦截处理。

1.2.2 Filter核心方法

  • init(FilterConfig filterConfig):初始化方法
  • doFilter(ServletRequest req, ServletResponse res, FilterChain chain):过滤处理方法
  • destroy():销毁方法

1.2.3 Filter示例

@WebFilter("/secured/*")
public class IPFilter implements Filter {
    private static final String ALLOWED_IP_RANGE = "192.168.0.";
    
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
        throws IOException, ServletException {
        String ipAddress = ((HttpServletRequest)req).getRemoteAddr();
        if (ipAddress.startsWith(ALLOWED_IP_RANGE)) {
            chain.doFilter(req, res); // 放行
        } else {
            ((HttpServletResponse)res).setStatus(HttpServletResponse.SC_FORBIDDEN);
            res.getWriter().println("Forbidden");
        }
    }
}

1.2.4 Filter生命周期

  1. 初始化阶段:Web应用启动时执行init方法
  2. 过滤阶段:每次请求匹配时执行doFilter方法
  3. 销毁阶段:Web应用卸载时执行destroy方法

1.2.5 Filter链

多个Filter组成Filter链,执行顺序由web.xml中的注册顺序决定:

<filter>
    <filter-name>Filter1</filter-name>
    <filter-class>com.example.Filter1</filter-class>
</filter>
<filter-mapping>
    <filter-name>Filter1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

1.2.6 Filter安全风险

  • 过滤器链劫持(Filter Chain Hijacking):攻击者注入恶意Filter拦截所有请求
  • 常见于允许自定义Filter的场景:
    • 开放平台/插件系统
    • 定制化Web框架
    • 中间件/应用服务器
    • 网络安全应用

1.3 Listener

1.3.1 Listener简介

基于观察者模式,用于监听并响应特定事件。主要组件:

  • 事件源(Event Source):触发事件的对象
  • 事件对象(Event Object):描述事件信息的对象
  • 监听器(Listener):处理事件的接口
  • 监听器方法(Listener Method):具体的事件处理方法

1.3.2 Listener示例

public class ButtonExample extends Frame {
    public ButtonExample(){
        Button button = new Button("Click Me");
        button.addActionListener(new ButtonClickListenner());
    }
    
    class ButtonClickListenner implements ActionListener{
        public void actionPerformed(ActionEvent e){
            System.out.println("Button Clicked!");
        }
    }
}

2. Tomcat架构详解

2.1 Tomcat概述

Apache Tomcat是开源的轻量级Java Servlet容器,主要特点:

  • Servlet/JSP容器
  • 轻量级
  • 开源
  • 可扩展
  • 跨平台

2.2 Tomcat核心组件

2.2.1 四大核心组件

  1. Server:Tomcat实例的顶层控制中心

    • 管理Service集合的生命周期
    • 通常一个Tomcat实例只有一个Server
  2. Service:关联Connector和Container

    • 每个Service可包含多个Connector
    • 每个Service只能有一个Container
    • 标准实现类:StandardService
  3. Connector:处理客户端连接请求

    • 将网络请求转化为Tomcat Request对象
    • 内部组件:
      • EndPoint:网络通信
      • Processor:生成Tomcat Request对象
      • Adapter:转换为ServletRequest对象
  4. Container:处理Servlet请求的接口

    • 使用责任链设计模式
    • 包含四个子容器:
      • Engine:最顶层容器
      • Host:虚拟主机
      • Context:Web应用
      • Wrapper:Servlet管理

2.2.2 容器层级结构

  1. Engine

    • 实现类:StandardEngine
    • 处理所有连接请求
    • 可包含多个Host
  2. Host

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

    • 实现类:StandardContext
    • 对应一个Web应用
    • 包含Servlet映射关系
    • 可包含多个Wrapper
  4. Wrapper

    • 实现类:StandardWrapper
    • 管理Servlet生命周期
    • 一个Wrapper可对应多个Servlet

2.3 Tomcat工作流程

  1. 客户端发送HTTP请求
  2. Connector接收请求并处理:
    • EndPoint处理网络连接
    • Processor生成Tomcat Request
    • Adapter转换为ServletRequest
  3. 请求传递到Container:
    • Engine → Host → Context → Wrapper
  4. 最终由Servlet处理请求并生成响应
  5. 响应沿原路返回给客户端

2.4 组件关系总结

  • Tomcat Server:顶层容器,承载所有服务
  • Service:独立服务单元,包含:
    • Connector:处理网络连接
    • Container:执行业务逻辑
  • Servlet API:提供开发接口,包括:
    • Filter:请求/响应过滤
    • Listener:生命周期监听
    • Adapter:与其他服务器集成

3. 综合知识串联

Java Web应用在Tomcat中的完整处理流程:

  1. 客户端请求到达Tomcat Server
  2. 匹配的Service接收请求
  3. Connector处理网络连接和协议转换
  4. 请求进入Container层级处理:
    • Engine → Host → Context → Wrapper
  5. 经过Filter链处理(如有)
  6. 最终由Servlet处理请求
  7. 响应沿原路返回,可能再次经过Filter处理
  8. Listener监听整个过程中的各种事件

这种架构设计实现了:

  • 清晰的职责分离
  • 灵活的扩展能力
  • 高效的请求处理
  • 安全的运行环境
Java Web 三大件与Tomcat架构详解 1. Java Web 三大件基础 Java Web开发中的三大核心组件是Servlet、Filter和Listener,它们构成了Java Web应用的基础架构。 1.1 Servlet 1.1.1 Servlet简介 Servlet是用Java编写的服务器端程序,用于处理客户端请求并生成动态响应。主要特点包括: 高效:支持缓存和多线程处理 方便:提供大量实用工具例程(解析表单数据、处理Cookie等) 功能强大:基于Java API 可移植性好:跨平台运行 1.1.2 Servlet执行过程 客户端发送请求至服务器 服务器遍历web.xml中的url-pattern,找到匹配的Servlet 执行service()方法,解析请求并匹配对应方法 生成响应内容并返回给客户端 1.1.3 Servlet核心接口 ServletConfig :封装web.xml中对当前Servlet的配置信息 ServletContext :代表Servlet运行环境,提供容器信息访问方法 setAttribute(name, value) getAttribute(name) removeAttribute(name) ServletRequest :封装客户端请求 ServletResponse :封装服务器响应 1.1.4 Servlet生命周期 初始化阶段(init方法) 服务器启动时或第一次请求时执行 只执行一次 服务阶段(service方法) 处理所有客户端请求 销毁阶段(destroy方法) 服务器关闭时执行 只执行一次 1.1.5 Servlet安全风险点 service()方法漏洞 SQL注入 XSS攻击 请求参数处理漏洞 路径遍历 命令注入 会话管理漏洞 会话劫持 会话固定 文件上传漏洞 恶意文件上传 服务器端代码执行 错误处理漏洞 敏感信息泄露 错误页面利用 1.2 Filter 1.2.1 Filter简介 Filter是Servlet技术的补充,用于在请求到达Servlet之前和响应返回客户端之前进行拦截处理。 1.2.2 Filter核心方法 init(FilterConfig filterConfig) :初始化方法 doFilter(ServletRequest req, ServletResponse res, FilterChain chain) :过滤处理方法 destroy() :销毁方法 1.2.3 Filter示例 1.2.4 Filter生命周期 初始化阶段:Web应用启动时执行init方法 过滤阶段:每次请求匹配时执行doFilter方法 销毁阶段:Web应用卸载时执行destroy方法 1.2.5 Filter链 多个Filter组成Filter链,执行顺序由web.xml中的注册顺序决定: 1.2.6 Filter安全风险 过滤器链劫持(Filter Chain Hijacking) :攻击者注入恶意Filter拦截所有请求 常见于允许自定义Filter的场景: 开放平台/插件系统 定制化Web框架 中间件/应用服务器 网络安全应用 1.3 Listener 1.3.1 Listener简介 基于观察者模式,用于监听并响应特定事件。主要组件: 事件源(Event Source):触发事件的对象 事件对象(Event Object):描述事件信息的对象 监听器(Listener):处理事件的接口 监听器方法(Listener Method):具体的事件处理方法 1.3.2 Listener示例 2. Tomcat架构详解 2.1 Tomcat概述 Apache Tomcat是开源的轻量级Java Servlet容器,主要特点: Servlet/JSP容器 轻量级 开源 可扩展 跨平台 2.2 Tomcat核心组件 2.2.1 四大核心组件 Server :Tomcat实例的顶层控制中心 管理Service集合的生命周期 通常一个Tomcat实例只有一个Server Service :关联Connector和Container 每个Service可包含多个Connector 每个Service只能有一个Container 标准实现类:StandardService Connector :处理客户端连接请求 将网络请求转化为Tomcat Request对象 内部组件: EndPoint:网络通信 Processor:生成Tomcat Request对象 Adapter:转换为ServletRequest对象 Container :处理Servlet请求的接口 使用责任链设计模式 包含四个子容器: Engine:最顶层容器 Host:虚拟主机 Context:Web应用 Wrapper:Servlet管理 2.2.2 容器层级结构 Engine : 实现类:StandardEngine 处理所有连接请求 可包含多个Host Host : 实现类:StandardHost 代表虚拟主机 可包含多个Context Context : 实现类:StandardContext 对应一个Web应用 包含Servlet映射关系 可包含多个Wrapper Wrapper : 实现类:StandardWrapper 管理Servlet生命周期 一个Wrapper可对应多个Servlet 2.3 Tomcat工作流程 客户端发送HTTP请求 Connector接收请求并处理: EndPoint处理网络连接 Processor生成Tomcat Request Adapter转换为ServletRequest 请求传递到Container: Engine → Host → Context → Wrapper 最终由Servlet处理请求并生成响应 响应沿原路返回给客户端 2.4 组件关系总结 Tomcat Server :顶层容器,承载所有服务 Service :独立服务单元,包含: Connector:处理网络连接 Container:执行业务逻辑 Servlet API :提供开发接口,包括: Filter:请求/响应过滤 Listener:生命周期监听 Adapter:与其他服务器集成 3. 综合知识串联 Java Web应用在Tomcat中的完整处理流程: 客户端请求到达Tomcat Server 匹配的Service接收请求 Connector处理网络连接和协议转换 请求进入Container层级处理: Engine → Host → Context → Wrapper 经过Filter链处理(如有) 最终由Servlet处理请求 响应沿原路返回,可能再次经过Filter处理 Listener监听整个过程中的各种事件 这种架构设计实现了: 清晰的职责分离 灵活的扩展能力 高效的请求处理 安全的运行环境