Filter过滤器

一、Spring boot中完整配置过滤器

pom.xml -- 依赖配置

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
</project>

 

FilterConfig.java -- 配置类

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {
    
    @Bean
    public FilterRegistrationBean<CustomFilter> customFilterRegistration() {
        FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.addUrlPatterns("/*"); // 拦截所有路径
        registration.setOrder(1); // 设置过滤器顺序
        registration.setName("customFilter");
        return registration;
    }
}

 

CustomFilter.java -- Filter实现类

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import java.io.IOException;

@Component
public class CustomFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) {
        System.out.println("Filter初始化:用于初始化资源");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain chain) throws IOException, ServletException {
        
        System.out.println("请求进入过滤器");
        if (!(response instanceof HttpServletResponse)) {
            return;
        }
        // 1. 前置处理(Controller执行前)
        long startTime = System.currentTimeMillis();
        
        // 2. 修改响应头示例(或者你需要的任何前置操作)
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("X-Filter-Enabled", "true");

        // 3. 放行请求到Controller
        chain.doFilter(request, response);
        
        // 4. 后置处理(Controller执行后)
        System.out.println("请求处理耗时: " + (System.currentTimeMillis() - startTime) + "ms");
    }

    @Override
    public void destroy() {
        System.out.println("Filter销毁");
    }
}

 

二、流程时序图

客户端请求 → 容器创建 Request/Response → Filter1.pre → Filter2.pre → ... → 
Servlet.service() → Controller → 
FilterN.post → ... → Filter1.post → 容器发送响应 → 客户端

关键点说明

当请求进入时,Servlet容器会‌提前创建好requestresponse 对象(此时尚未处理业务逻辑),这两个对象会贯穿整个请求生命周期。因此即使未生成实际响应内容,response 对象本身已经存在。也就是说这里的 Request/Response 是容器预先构建的‌响应对象外壳‌,虽然响应内容未生成,但对象本身已存在且可配置基础属性(如状态码、头信息)。

  • CustomFilter实现核心逻辑:包含请求前/后的处理点,通过chain.doFilter()控制流程
  • FilterConfig配置类:使用Spring Boot的FilterRegistrationBean注册过滤器并设置拦截规则
  • 完整生命周期支持:init/destroy方法可用于资源初始化和清理
  • 执行顺序控制:通过setOrder()可调整多个过滤器的执行优先级
  • chain.doFilter() 的作用‌
    • 调用前:拦截或修改请求(如权限校验、日志记录)
    • 调用后:修改响应(如压缩数据、添加头信息
  • 响应对象 (HttpServletResponse) 的生命周期‌
    • 即使未调用 chain.doFilter(),response 对象仍可设置状态码/头信息(但不会触发业务逻辑)。
  • 异常处理‌
    • 若 Filter 抛出异常,流程终止并返回错误响应(跳过后续 Filter 和 Controller)。
  • Spring Boot 的 OncePerRequestFilter‌
    • 确保每个请求仅通过 Filter 一次(避免嵌套调用导致的重复执行)。
 

 

posted @ 2025-09-25 00:58  我用python写Bug  阅读(12)  评论(0)    收藏  举报