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

web中的过滤器和拦截器

过滤器和拦截器

  • 区别
  • 执行顺序
  • 使用场景
  • 代码示例

区别

过滤器 (Filter)是Java Servlet 规范的一部分,不依赖Spring,可以过滤几乎所有请求;拦截器(Interceptor)是Spring MVC 框架的一部分,依赖Spring容器,只能拦截DispatcherServlet分配的、指向Controller的请求。

执行顺序

1. 请求进入 (Request)
2. → 过滤器 (Filter) 的 doFilter() 方法
3. → DispatcherServlet (Spring MVC 核心控制器)
4. → 拦截器 (Interceptor) 的 preHandle() 方法
5. → 执行目标 Controller 方法
6. → 拦截器 (Interceptor) 的 postHandle() 方法
7. → 渲染视图 (ViewResolver)
8. → 拦截器 (Interceptor) 的 afterCompletion() 方法
9. → 过滤器 (Filter) 的 doFilter() 方法后续逻辑
10. → 响应返回 (Response)

使用场景

过滤器:处理HTTP请求和响应最底层的操作(如修改流、压缩、统一编码、全站安全校验)
拦截器:处理与Spring MVC的请求处理生命周期紧密相关(如Controller方法执行前、后),或者需要操作HandlerMethod和ModelAndView

代码示例

自定义过滤器

@Component
@Order(1) // 定义过滤器的执行顺序
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {// 注意:这里直接@Autowired可能失效,因为Filter不由Spring管理// 需要通过其他方式获取Spring Bean(如WebApplicationContextUtils)@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1. 在Controller处理之前执行 (预处理)System.out.println("Filter: Before controller");HttpServletRequest req = (HttpServletRequest) request;// 例如:设置统一编码req.setCharacterEncoding("UTF-8");// 继续执行过滤器链,最终会到达Servletchain.doFilter(request, response); // 这一句非常关键,相当于放行// 2. 在Controller处理之后执行 (后处理)System.out.println("Filter: After controller");// 例如:可以对Response进行操作HttpServletResponse resp = (HttpServletResponse) response;resp.setHeader("X-Custom-Header", "Hello");}// init 和 destroy 方法...
}

自定义拦截器

@Component
public class MyInterceptor implements HandlerInterceptor {// 可以方便地注入Spring管理的Bean@Autowiredprivate UserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// Controller方法执行之前调用System.out.println("Interceptor: preHandle - " + request.getRequestURI());// 权限检查示例String token = request.getHeader("Authorization");if (!userService.isValidToken(token)) {response.sendError(401, "Unauthorized");return false; // 中断执行,不会再到Controller}return true; // 继续执行,到Controller}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// Controller方法执行之后、视图渲染之前调用System.out.println("Interceptor: postHandle");// 可以修改ModelAndViewif (modelAndView != null) {modelAndView.addObject("extraData", "added by interceptor");}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 整个请求完成之后(视图已渲染)调用,常用于资源清理、日志记录异常System.out.println("Interceptor: afterCompletion");if (ex != null) {// 记录异常日志System.err.println("Request failed with exception: " + ex.getMessage());}}
}// 还需要一个配置类来注册拦截器并指定路径
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/api/**") // 只拦截/api开头的请求.excludePathPatterns("/api/login"); // 排除登录接口}
}
http://www.dtcms.com/a/353297.html

相关文章:

  • LaTeX论文转word插入mathtype公式
  • KRaft vs ZooKeeper为何迁移、差异全览与落地实践
  • open3D学习笔记
  • 微软研究院最新tts模型VIBEVOICE解析
  • 配送算法16 A Deep Reinforcement Learning Approach for the Meal Delivery Problem
  • postgreSql远程连接数据库总是超时断开?
  • c#联合vision master 的基础教程
  • linux安装containerd
  • 如何使用 Xshell 8 连接到一台 CentOS 7 电脑(服务器)
  • MySQL 8 与 PostgreSQL 17 对比分析及迁移指南
  • 学习 Android (十七) 学习 OpenCV (二)
  • 【PHP】数学/数字处理相关函数汇总,持续更新中~
  • 极限RCE之三字节RCE
  • 嵌入式学习日记(35)TCP并发服务器构建
  • 指纹手机应用核心技术解析:从识别到智能交互
  • 搭建域服务器
  • 毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)
  • ChatGPT登录不进怎么办?
  • NumPy广播机制:高效数组运算的秘诀
  • 预测模型及超参数:2.传统机器学习:PLS及其改进
  • 守术,明法,悟道
  • 欧盟《人工智能法案》生效一年主要实施进展概览(二)
  • 如何借助文档控件 TX Text Control 轻松优化 PDF 文件大小?
  • 中科大携手智源发布 BGE-Reasoner:引领推理式信息检索新高度
  • AI数据治理:战略选择与伦理平衡
  • C6.4:晶体管模型
  • 语言切换时广播没有监听到语言变化
  • 从传统到创新:用报表插件重塑数据分析平台
  • OpenTelemetry 在 Spring Boot 项目中的3种集成方式
  • SciPy科学计算与应用:SciPy应用实战-数据分析与工程计算