Spring MVC 拦截器与核心组件全解|过滤器、拦截器、AOP 深度对比 Spring MVC 拦截器与核心组件全解过滤器、拦截器、AOP 深度对比在 Java Web 开发中Spring MVC 是后端最核心的 Web 框架几乎所有 Spring Boot 项目的请求处理都基于其底层机制。很多开发者日常频繁使用拦截器、过滤器、全局异常处理等功能但始终分不清Filter、Interceptor、AOP的层级差异和使用场景也不了解完整的请求执行链路。本文将从零详解 Spring MVC 拦截器核心原理、实战用法区分三大切面机制的差异并梳理 Spring MVC 全部核心组件的工作流程帮你彻底吃透 Web 请求底层原理适配面试和实战开发。一、什么是 Spring MVC 拦截器Interceptor拦截器是Spring MVC 框架专属的请求切面扩展机制基于 Spring AOP 思想实现用于在 Controller 请求处理的前置、中置、后置阶段植入自定义逻辑。它的核心优势是不侵入业务代码通过横切方式实现请求管控且完美适配 Spring 容器支持依赖注入、获取 Spring 上下文信息是业务层请求拦截的首选方案。1.1 核心顶层接口HandlerInterceptor自定义拦截器必须实现HandlerInterceptor接口该接口定义了三个核心生命周期方法覆盖请求全流程执行时机各有不同✅ preHandle前置拦截在Controller 方法执行之前触发。返回true请求放行继续执行后续流程返回false直接中断请求终止后续所有操作核心场景登录校验、JWT 令牌解析、接口权限校验、请求参数基础校验、接口限流。✅ postHandle中置处理在Controller 方法执行完毕、视图渲染之前触发。可以获取并修改ModelAndView对象调整视图数据、跳转路径仅对模板视图项目有效。注意前后端分离项目返回 JSON该方法基本失效。✅ afterCompletion后置收尾在整个请求完全结束视图渲染完成/请求异常终止后触发无论请求成功、报错、拦截终止都会执行。核心场景资源释放、接口耗时统计、请求日志归档、异常信息记录、线程上下文清理。1.2 实战代码自定义登录拦截器以最常用的未登录拦截跳转为例实现基础的会话校验功能publicclassLoginInterceptorimplementsHandlerInterceptor{/** * 前置拦截校验用户登录状态 */OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{// 排除静态资源、基础路径校验StringrequestURIrequest.getRequestURI();// 从Session获取登录用户Objectuserrequest.getSession().getAttribute(loginUser);if(usernull){// 未登录重定向到登录页response.sendRedirect(/login);returnfalse;}// 登录成功放行请求returntrue;}/** * Controller执行后、视图渲染前执行 */OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView){// 可自定义修改视图数据、跳转逻辑}/** * 请求完全结束后收尾工作 */OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){// 清理线程资源、统计接口耗时}}1.3 拦截器注册配置拦截器定义后不会自动生效需要通过实现WebMvcConfigurer接口完成注册、配置拦截路径和放行路径。ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newLoginInterceptor())// 拦截所有请求.addPathPatterns(/**)// 放行登录、注册、静态资源、接口文档等无需拦截路径.excludePathPatterns(/login,/register,/static/**,/favicon.ico,/doc.html);}}1.4 多拦截器执行顺序洋葱模型项目中可配置多个拦截器Spring MVC 遵循洋葱模型执行核心规则preHandle按注册顺序正序执行postHandle、afterCompletion按注册顺序逆序执行举例先注册拦截器 A再注册拦截器 B完整执行链路A.pre → B.pre → Controller 执行 → B.post → A.post → 视图渲染 → B.after → A.after1.5 拦截器经典应用场景用户登录、会话状态校验JWT、Token 令牌解析与权限校验RBAC接口访问日志记录、请求耗时统计接口防重复提交、高频请求限流请求头统一参数封装、透传TraceId、租户ID二、过滤器Filter详解很多新手容易混淆拦截器和过滤器二者本质完全不同Filter 是 Java EE 原生 Servlet 规范组件不属于 Spring 框架由 Tomcat、Jetty 等 Web 容器管理。2.1 核心特性作用层级Web 容器最外层优先于所有 Spring 组件执行拦截范围拦截所有 HTTP 请求包括静态资源html、js、css、图片Spring 支持默认无法直接注入 Spring Bean需特殊配置依赖规范原生 Servlet API与 Spring 框架解耦2.2 Filter 代码示例WebFilter(urlPatterns/api/*)publicclassGlobalCorsFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{// 前置处理设置跨域、编码格式HttpServletResponseres(HttpServletResponse)response;res.setHeader(Access-Control-Allow-Origin,*);res.setContentType(text/html;charsetUTF-8);// 放行请求进入下一个过滤器/拦截器chain.doFilter(request,response);// 后置处理响应结果统一处理}}2.3 Filter 经典应用场景Filter 适合做全局通用、与业务无关的底层预处理全局请求编码统一设置CORS 跨域统一处理XSS、SQL 注入基础防护全链路追踪 TraceId、日志ID 透传三、Filter、Interceptor、AOP 三者深度对比这三者是 Java Web 开发中最核心的三层横切机制层级从外到内依次为Filter → Interceptor → AOP。下面通过全方位对比彻底区分三者差异。对比维度Filter过滤器Interceptor拦截器AOP切面所属规范/框架Java EE Servlet 规范Spring MVC 框架Spring / AspectJ作用层级Web 容器层最外层Spring MVC 框架层中间层业务方法层最内层拦截范围所有请求含静态资源仅 Controller 接口请求任意 Spring Bean 方法Service/ControllerSpring 依赖注入不支持原生支持 Autowired原生支持 Autowired核心上下文能力仅能获取 Request/Response可获取 HandlerMethod、ModelAndView仅能获取方法参数、返回值、注解全局异常捕获无法被全局异常处理器捕获可被 RestControllerAdvice 捕获可捕获但无法修改 HTTP 状态码核心用途底层通用预处理跨域、编码业务请求管控登录、权限方法级增强事务、缓存、日志3.1 完整请求执行全链路重中之重一次完整的 HTTP 请求从接入到响应的完整执行顺序HTTP请求 → Filter过滤器 → DispatcherServlet → Interceptor.preHandle → Controller → AOP(Before) → Service业务逻辑 → AOP(After) → Interceptor.postHandle → 视图渲染 → Interceptor.afterCompletion → Filter后置处理 → HTTP响应四、Spring MVC 全套核心组件详解Spring MVC 并非只有拦截器而是由一套完整的组件协同工作完成请求分发、参数解析、业务执行、视图渲染、异常处理全流程。下面梳理所有核心组件的职责。4.1 DispatcherServlet前端控制器Spring MVC 核心入口、总调度中心。所有 HTTP 请求都会统一进入该组件负责协调所有 MVC 组件分发请求、调度流程是整个框架的核心枢纽。4.2 HandlerMapping处理器映射器核心职责根据请求 URL 匹配对应的 Controller 方法。会扫描项目中所有RequestMapping注解建立 URL 与处理器的映射关系最终返回HandlerExecutionChain包含目标 Controller 方法 匹配的拦截器链。4.3 HandlerAdapter处理器适配器负责适配不同类型的处理器完成请求参数绑定、类型转换、数据校验将 HTTP 请求参数封装为 Java 方法入参最终调用执行目标 Controller 方法。核心作用统一适配不同格式的处理器解耦请求分发与方法执行。4.4 ModelAndView模型视图封装封装一次请求的数据模型和视图信息Model存储业务查询数据用于视图渲染展示View存储逻辑视图名称用于匹配物理视图文件⚠️ 前后端分离项目中通过ResponseBody直接返回 JSON 数据不会使用视图渲染该组件基本不生效。4.5 ViewResolver视图解析器将 Controller 返回的逻辑视图名解析为真实的物理视图文件完成页面渲染。常用实现类InternalResourceViewResolver传统 JSP 视图解析器ThymeleafViewResolver主流 Thymeleaf 模板视图解析器4.6 HandlerExceptionResolver全局异常处理器统一拦截处理 Controller、Service 执行过程中的所有异常避免原生异常堆栈直接返回前端实现统一异常响应、友好提示。日常开发常用注解ExceptionHandler单个控制器内方法级异常处理RestControllerAdvice全局统一异常处理前后端分离必备ResponseStatusExceptionResolver自定义异常映射 HTTP 状态码五、核心总结与开发规范通过三层横切机制 MVC 核心组件Spring MVC 实现了请求分层处理、职责单一解耦的设计思想实际开发中严格遵循以下分工原则Filter最外层只做容器级通用操作跨域、编码、安全过滤、链路ID透传不处理业务逻辑Interceptor中间层专注接口业务管控登录校验、权限拦截、请求日志、限流防重AOP最内层专注方法级增强事务控制、缓存操作、接口性能监控、日志记录三者各司其职、配合使用既能保证代码解耦又能实现复杂的 Web 请求管控逻辑也是面试中 Spring MVC 模块的核心考点。