当前位置: 首页 > news >正文

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 {@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容器会‌提前创建好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 一次(避免嵌套调用导致的重复执行)。
 

 

http://www.hskmm.com/?act=detail&tid=15998

相关文章:

  • 程序员的旅行神器:用AI提示词工程解决选择困难症
  • 修改人大金仓V8数据库时间
  • BUUCTF-babyheap_0ctf_2017题解(含详细过程与思路分析)
  • 油猴(Tampermonkey)插件从安装到使用
  • 【EF Core】框架底层的数据库连接管理
  • iNeuOS工业互联网操作系统,更新计量数据处理方式和在线报表,实现能源管理基础功能
  • React 展示Markdown内容 - 教程
  • 西电PCB设计指南第4章学习笔记
  • 图像处理去除噪点验证码的识别逻辑实践
  • Java文件上传和其他参数一起提交的案例
  • 三维模型非结构化网格生成
  • Windows 环境变量配置
  • Playwright MCP浏览器自动化指南 - 详解
  • 完整教程:【C++】STL简介+编码表+string引入
  • SpringBootMVC相关内容
  • 基于节流的流水线并行推理优化——gLLM
  • Corral the Cows
  • HarmonyOS 5 通知与语音能力开发实战:从消息推送到智能语音交互
  • HarmonyOS 5 Native与ArkTS混合开发实战:跨语言高性能组件开发
  • 实战:基于HarmonyOS 5构建分布式聊天通讯应用
  • Java-Eclipse使用-多维数组的使用
  • HarmonyOS 5 动画开发实战:从基础动效到高级交互动画
  • HarmonyOS 5 高级动效实战:粒子系统、路径动画与物理动效开发
  • 从范德蒙德矩阵聊开去.
  • HarmonyOS 5 动画性能优化深度解析:从原理到实践
  • HarmonyOS 5 性能优化全攻略:从启动加速到内存管理
  • #字符串执行函数——eval()、exec()和compile()详解
  • HarmonyOS 5 网络编程与数据存储实战:从RESTful API到本地持久化
  • 【光照】[环境光ambient]以UnityURP为例
  • 浅谈当前时代下大学生的就业择业及人生规划