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容器会提前创建好 request 和 response 对象(此时尚未处理业务逻辑),这两个对象会贯穿整个请求生命周期。因此即使未生成实际响应内容,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 一次(避免嵌套调用导致的重复执行)。

浙公网安备 33010602011771号