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

Spring中过滤器和拦截器的区别及具体实现

在 Spring 框架中,过滤器(Filter)拦截器(Interceptor) 都是用于处理 HTTP 请求的中间件,但它们在作用范围、实现方式和生命周期上有显著区别。以下是详细对比和实现方式:


核心区别

特性过滤器 (Filter)拦截器 (Interceptor)
规范Servlet 规范 (J2EE 标准)Spring 框架特有
作用范围所有 Web 资源(Servlet、JSP、静态资源)仅 Spring MVC 管理的 Controller 请求
依赖依赖 Servlet 容器(如 Tomcat)依赖 Spring 容器
拦截时机在请求进入 Servlet 前 / 响应发送到客户端前在请求进入 Controller 前 / 后 / 视图渲染后
获取 Spring Bean不能直接获取(需通过工具类)可直接获取 Spring Bean
异常处理无法使用 Spring 的异常处理机制可结合 @ControllerAdvice 统一异常处理

实现方式

1. 过滤器 (Filter) 实现

过滤器是 Servlet 规范的一部分,通过实现 javax.servlet.Filter 接口实现。

步骤:

  1. 创建 Filter 类
import javax.servlet.*;
import java.io.IOException;public class CustomFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {// 初始化逻辑}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1. 请求到达 Controller 前的逻辑System.out.println("Before Controller (Filter)");// 放行请求chain.doFilter(request, response);// 2. 响应返回客户端前的逻辑System.out.println("After Controller (Filter)");}@Overridepublic void destroy() {// 销毁逻辑}
}
  1. 注册过滤器(Spring Boot 中)
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> customFilter() {FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>();bean.setFilter(new CustomFilter());bean.addUrlPatterns("/*"); // 拦截所有路径bean.setOrder(1); // 执行顺序return bean;}
}

2. 拦截器 (Interceptor) 实现

拦截器是 Spring MVC 的组件,通过实现 HandlerInterceptor 接口。

步骤:

  1. 创建 Interceptor 类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 在 Controller 方法执行前调用System.out.println("Before Controller (Interceptor)");return true; // true=放行, false=中断请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 在 Controller 方法执行后、视图渲染前调用System.out.println("After Controller (Interceptor)");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在整个请求完成后调用(视图渲染完毕)System.out.println("After View Render (Interceptor)");}
}
  1. 注册拦截器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Autowiredprivate CustomInterceptor customInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(customInterceptor).addPathPatterns("/**")    // 拦截所有路径.excludePathPatterns("/login"); // 排除路径}
}

执行顺序示例

假设请求路径被过滤器和拦截器同时拦截:

1. Filter: doFilter() [前逻辑]
2. Interceptor: preHandle()
3. Controller 方法执行
4. Interceptor: postHandle()
5. 视图渲染
6. Interceptor: afterCompletion()
7. Filter: doFilter() [后逻辑]

如何选择?

场景推荐使用
全局日志、字符编码、安全过滤Filter
权限验证、参数预处理Interceptor
需要 Spring 容器功能Interceptor
非 Spring 项目Filter

最佳实践:优先使用 Interceptor(可集成 Spring 特性),若需处理静态资源或深度请求/响应修改,则用 Filter。

http://www.lryc.cn/news/582860.html

相关文章:

  • 26.安卓逆向2-frida hook技术-解密响应
  • LoRaWAN 有几种入网方式?
  • DMA技术与音频数据的存储和播放
  • LLM视觉领域存在模型视觉识别不准确、细粒度视觉任务能力不足等科学问题
  • (四)机器学习小白入门YOLOv :图片标注实操手册
  • C#中封装halcon函数的报错
  • 用基础模型构建应用(第七章)AI Engineering: Building Applications with Foundation Models学习笔记
  • Google AI 刚刚开源 MCP 数据库工具箱,让 AI 代理安全高效地查询数据库
  • 推荐系统中的相似度
  • JAVAEE 代理
  • 短视频电商APP源码开发技术栈解析:音视频、商品链路与互动设计
  • 怪物机制分析(有限状态机、编辑器可视化、巡逻机制)
  • DCL学习
  • SpringAI学习笔记-MCP客户端简单示例
  • C#Halcon从零开发_Day18_OCR识别
  • SpringAI系列 - 基于Spring AI 1.0.0 的AI助手实现示例
  • 图像梯度处理与边缘检测:OpenCV 实战指南
  • Apache Atlas编译打包,可运行包下载地址
  • VM上创建虚拟机以及安装RHEL9操作系统并ssh远程连接
  • 7月8日星期二今日早报简报微语报早读
  • XSLT注入与安全修复方法
  • 人工智能与人工智障———仙盟创梦IDE
  • 【Note】《Kafka: The Definitive Guide》第11章:Stream Processing
  • 【Bluedroid】BLE 地址解析列表的初始化与清除机制(btm_ble_resolving_list_init)
  • MySQL 8.0 OCP 1Z0-908 题目解析(23)
  • Kafka消息倾斜
  • 编码器(Encoder)和解码器(Decoder)
  • Spring注解驱动开发
  • window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
  • Flutter基础(前端教程④-组件拼接)