Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析

一、理解核心概念

在 Java Web 开发中,过滤器(Filter)拦截器(Interceptor)是两种核心的请求处理机制。它们虽然都能对请求进行拦截和处理,但定位截然不同:

  • Filter 是 Servlet 容器的"守门人",位于应用最外层
  • Interceptor 是 Spring MVC 的"执法官",位于框架内部

二、Filter:Servlet 容器的第一道防线

2.1 本质与特点

Filter 是 Java Servlet 规范 定义的组件,由 Servlet 容器(如 Tomcat)直接管理,不依赖任何框架,因此具有最强的通用性。

生命周期方法:

方法

触发时机

用途

init()

应用启动时

初始化配置

doFilter()

每次请求

核心处理逻辑

destroy()

应用关闭时

资源释放

执行流程:

请求 → Filter1 → Filter2 → Servlet/Controller → Filter2 → Filter1 → 响应

2.2 Spring Boot 中的实现方式

方式一:注解方式(适合简单场景)

@WebFilter(urlPatterns = "/api/*", filterName = "authFilter") public class AuthFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 前置处理 System.out.println("认证检查开始"); // 放行到下一个 Filter 或目标资源 chain.doFilter(request, response); // 后置处理(响应返回时执行) System.out.println("认证检查结束"); } } // 在主类开启扫描 @SpringBootApplication @ServletComponentScan public class Application { }

方式二:配置类方式(推荐,更灵活)

@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<AuthFilter> authFilter() { FilterRegistrationBean<AuthFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new AuthFilter()); bean.addUrlPatterns("/api/*"); bean.setOrder(1); // 控制执行顺序,数字越小越先执行 return bean; } }

2.3 Filter 的典型应用场景

场景

说明

统一编码

设置 UTF-8 编码,解决中文乱码

安全防护

XSS 过滤、SQL 注入检测

跨域处理

添加 CORS 响应头

请求日志

记录所有请求的 IP、路径、耗时

数据压缩

Gzip 压缩响应内容


三、Interceptor:Spring MVC 的精准拦截

3.1 本质与特点

Interceptor 是 Spring MVC 框架 提供的机制,只能拦截被 DispatcherServlet 处理的请求(即映射到 Controller 的请求)。它可以获取 Spring 上下文,与业务逻辑深度集成。

三个核心拦截点:

方法

执行时机

能否终止请求

典型用途

preHandle()

Controller 方法执行前

可返回 false

终止

登录验证、权限校验

postHandle()

Controller 执行后,视图渲染前

无法终止

修改 Model、添加公共数据

afterCompletion()

请求处理完成(含异常)

无法终止

资源清理、异常日志

3.2 完整实现示例

@Component public class PermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求信息 String uri = request.getRequestURI(); System.out.println("【拦截】请求路径: " + uri); // 权限校验逻辑 HttpSession session = request.getSession(); if (session.getAttribute("user") == null && uri.startsWith("/admin")) { response.sendRedirect("/login"); return false; // 拦截,不继续执行 } return true; // 放行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 向视图添加通用数据 if (modelAndView != null) { modelAndView.addObject("serverTime", new Date()); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 记录异常信息 if (ex != null) { System.out.println("【异常】请求处理出错: " + ex.getMessage()); } // 清理 ThreadLocal 等资源 } }

注册 Interceptor:

@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private PermissionInterceptor permissionInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(permissionInterceptor) .addPathPatterns("/admin/**", "/user/**") // 拦截路径 .excludePathPatterns("/login", "/public/**"); // 排除路径 } }

四、核心区别对比

对比维度

Filter

Interceptor

规范来源

Servlet 规范(J2EE)

Spring MVC 框架

框架依赖

不依赖 Spring,任何 Web 应用可用

必须在 Spring 环境中使用

拦截范围

所有请求(含静态资源、JSP)

仅 DispatcherServlet 映射的请求

执行时机

Servlet 之前

Controller 前后

方法数量

1 个 doFilter()

3 个:preHandlepostHandleafterCompletion

可获取对象

ServletRequestServletResponse

HttpServletRequestHandlerMethodModelAndView

异常处理

只能捕获 Filter 内部异常

afterCompletion可捕获 Controller 异常

静态资源拦截

支持

默认不支持


五、执行顺序详解

当 Filter 和 Interceptor 同时存在时,执行流程如下:

1. Filter.doFilter() 前置代码 ↓ 2. Interceptor.preHandle() ↓ 3. Controller 方法执行 ↓ 4. Interceptor.postHandle() ↓ 5. 视图渲染 ↓ 6. Interceptor.afterCompletion() ↓ 7. Filter.doFilter() 后置代码

示意图:

请求进入 ↓ [Filter 1] ──┐ ↓ │ [Filter 2] │ 过滤器链(双向拦截) ↓ │ [Servlet] │ ↓ │ [Interceptor 1.preHandle] ──┐ ↓ │ [Interceptor 2.preHandle] │ ↓ │ [Controller 执行] │ 拦截器链(三阶段) ↓ │ [Interceptor 2.postHandle] │ ↓ │ [Interceptor 1.postHandle] │ ↓ │ [视图渲染] │ ↓ │ [Interceptor 1.afterCompletion]┘ ↓ [Interceptor 2.afterCompletion] ↓ [Filter 2 后置] ↓ [Filter 1 后置] ↓ 响应返回

六、实战选择指南

6.1 优先使用 Filter 的场景

  • 统一字符编码:需要在请求进入 Servlet 前就设置编码
  • 跨域处理(CORS):处理 OPTIONS 预检请求,早于 Spring MVC
  • 安全过滤:XSS、SQL 注入的输入预处理
  • 全局日志:记录所有 HTTP 请求的完整生命周期
  • 非 Spring 环境:纯 Servlet 应用

6.2 优先使用 Interceptor 的场景

  • 登录状态校验:可便捷获取 HttpSession 和 Spring Bean
  • 细粒度权限控制:结合 @PreAuthorize、Security 上下文
  • 性能监控:精确统计 Controller 执行时间
  • 业务操作日志:获取 HandlerMethod 知道调用了哪个方法
  • 视图数据增强:在 postHandle 中向 Model 添加数据

七、黄金组合实践

在实际项目中,两者配合使用才能发挥最大价值:

层级

组件

职责

外层

Filter

编码设置、CORS、XSS 过滤、请求日志

内层

Interceptor

登录验证、权限校验、性能监控、业务日志

典型配置示例:

// Filter 处理通用底层逻辑 @Bean public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new CharacterEncodingFilter("UTF-8", true)); bean.addUrlPatterns("/*"); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最先执行 return bean; } // Interceptor 处理业务逻辑 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/api/login"); }

八、面试高频问题

Q1:Filter 和 Interceptor 的本质区别是什么?

Filter 是 Servlet 规范,由容器管理;Interceptor 是 Spring MVC 机制,由框架管理。Filter 更早执行,能拦截所有请求;Interceptor 更晚执行,只能拦截 Spring MVC 请求,但能获取更丰富的上下文。

Q2:如何让 Interceptor 拦截静态资源?

修改 DispatcherServleturl-pattern/*,但会带来性能开销,通常不建议。静态资源拦截建议用 Filter。

Q3:afterCompletion 一定会执行吗?

只要 preHandle 返回 true 并执行了,无论后续是否异常,afterCompletion 都会执行,适合资源清理。

Q4:如何控制多个 Filter 的执行顺序?

使用 FilterRegistrationBeansetOrder() 方法,数字越小优先级越高。


九、总结

Filter

Interceptor

定位

容器层"护城河"

框架层"城门守卫"

优势

通用、底层、无框架依赖

精细、灵活、可获取 Spring 上下文

最佳实践

处理通用、底层问题

处理业务、安全、监控逻辑

核心原则:Filter 做"通用处理",Interceptor 做"业务拦截",两者协同构建完整的请求处理体系。

Read more

全开源,自主可控!这款 AI + 无人机一体化平台,多行业刚需场景直接拉满!

全开源,自主可控!这款 AI + 无人机一体化平台,多行业刚需场景直接拉满!

项目地址: https://gitee.com/haishi-tech 引言 低空经济产业化加速推进,无人机行业应用却常被设备管控难、作业效率低、数据碎片化三大痛点卡脖子。专为专业场景打造的亥时无人机系统,以 “智能管理 + AI 监测 + 精准控制” 全流程闭环解决方案,打破行业应用壁垒,成为电力、安防、测绘等专业用户的共同选择! 核心优势:全面开源,成熟可控 系统简介 1. 一体化架构,告别零散适配烦恼亥时无人机系统深度集成设备管理、飞行控制、AI 监测与巡检业务四大核心模块,构建 “端 - 边 - 云” 全链路技术支撑。无需额外开发适配,从设备接入、飞行操控到数据分析、报告生成实现无缝衔接,彻底解决传统方案多系统割裂、数据不通的痛点,让作业流程更顺畅。 1. 2. AI 监测中台,让智能贯穿全流程

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人

DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 目录 DAY4 基于 OpenClaw + 飞书开放平台实现 AI 新闻推送机器人 前  言 1 环境准备 1.1 华为云开发环境 1.2 ModelArts 代金券与模型服务 1.3 启动 OpenClaw 网关 2 飞书开放平台配置 2.1 创建企业自建应用 2.2 添加机器人能力 2.3 配置应用权限 2.4 发布应用版本 3 OpenClaw 与飞书集成 3.1 配置 OpenClaw

空天地联动 | 一网统飞 | 无人机巡检系统落地方案

空天地联动 | 一网统飞 | 无人机巡检系统落地方案

一、政策需求 国家将低空经济列为战略性新兴产业,“十五五” 规划明确推进一网统飞、低空智治全国覆盖,要求 2026 年前实现地市一级飞行数据全接入、空域审批一体化、低空监管数字化。多部委联合发文,推动低空通信、导航、感知基础设施建设,规范无人机飞行与空域管理,鼓励以统一平台、统一调度、统一数据模式支撑政务巡检、应急救援、生态环保、城市治理等场景规模化落地,加速低空经济从试点走向全域普及。 二、市场需求与行业痛点 1. 空域管理分散,审批效率低:多部门分头审批、流程繁琐,跨区域飞行难,“黑飞”、乱飞风险突出,安全监管压力大。 2. 部门各自为战,资源浪费严重:各单位自建系统、自购设备,重复飞行、重复投入,财政成本高、资源利用率低。 3. 数据孤岛普遍,价值难释放:巡检数据格式不统一、无法共享,难以支撑决策与协同处置。 4.

【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

【数据集+完整源码】【YOLO】无人机数据集,目标检测无人机检测数据集 7261 张,YOLO无人机识别系统实战训练教程,yolo无人机检测。

文章前瞻:优质数据集与检测系统精选 点击链接:更多数据集与系统目录清单 数据集与检测系统数据集与检测系统基于深度学习的道路积水检测系统基于深度学习的道路垃圾检测系统基于深度学习的道路裂缝检测系统基于深度学习的道路交通事故检测系统基于深度学习的道路病害检测系统基于深度学习的道路积雪结冰检测系统基于深度学习的汽车车牌检测系统基于深度学习的井盖丢失破损检测系统基于深度学习的行人车辆检测系统基于深度学习的航拍行人检测系统基于深度学习的车辆分类检测系统基于深度学习的电动车头盔佩戴检测系统基于深度学习的交通信号灯检测系统基于深度学习的共享单车违停检测系统基于深度学习的摆摊占道经营检测系统基于深度学习的人员游泳溺水检测系统基于深度学习的航拍水面垃圾检测系统基于深度学习的水面垃圾检测系统基于深度学习的水面船舶分类检测系统基于深度学习的海洋垃圾检测系统基于深度学习的救生衣穿戴检测系统基于深度学习的海洋生物检测系统基于深度学习的人员吸烟检测系统基于深度学习的口罩佩戴检测系统基于深度学习的烟雾和火灾检测系统基于深度学习的人员睡岗玩手机检测系统基于深度学习的人员摔倒检测系统基于深度学习的人员姿势检测系