一、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 {@Beanpublic 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 {@Overridepublic void init(FilterConfig filterConfig) {System.out.println("Filter初始化:用于初始化资源");}@Overridepublic 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");}@Overridepublic 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 一次(避免嵌套调用导致的重复执行)。