Spring拦截器实现原理及应用场景

360影视 日韩动漫 2025-05-06 14:33 3

摘要:Spring 拦截器(Interceptor)是基于责任链模式设计的,主要用于在请求处理的不同阶段(如 Controller 方法执行前、后)插入自定义逻辑。其核心实现依赖于 Spring MVC 框架的HandlerInterceptor接口和Dispatc

Spring 拦截器(Interceptor)是基于 责任链模式 设计的,主要用于在请求处理的不同阶段(如 Controller 方法执行前、后)插入自定义逻辑。其核心实现依赖于 Spring MVC 框架的 HandlerInterceptor 接口和 DispatcherServlet 的调度机制。

核心实现原理

接口定义:HandlerInterceptor
Spring 拦截器的核心接口是 HandlerInterceptor,定义了三个关键方法:

Ø preHandle:在 Controller 方法执行前调用,返回 true 表示继续执行后续拦截器和 Controller,返回 false 则中断流程。

Ø postHandle:在 Controller 方法执行后、视图渲染前调用(但若 Controller 抛出异常则不执行)。

Ø afterCompletion:在整个请求完成后调用(无论是否成功,都会执行),一般用于资源清理。

java

public interface HandlerInterceptor {

default boolean preHandle(HttpServletrequest request, HttpServletResponse response, Object handler) throws Exception {

return true;

}

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}

default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}

}

拦截器的注册
拦截器通过 WebMvcConfigureraddInterceptors 方法注册到 Spring MVC 的拦截器链中:

java

@Configuration

public class WebConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new LogInterceptor).addPathPatterns("/**");

registry.addInterceptor(new AuthInterceptor).addPathPatterns("/secure/**");

}

}

执行流程

Ø 请求到达 DispatcherServlet:Spring MVC 的入口 DispatcherServlet 接收到请求后,根据请求路径匹配对应的 HandlerMapping

Ø 构建拦截器链DispatcherServlet 根据配置的拦截器,按顺序构建拦截器链。

Ø 执行 preHandle:按顺序调用拦截器的 preHandle 方法,若某个拦截器返回 false,则终止后续处理。

Ø 执行 Controller 方法:若所有 preHandle 返回 true,则执行 Controller 方法。

Ø 执行 postHandle:Controller 执行完毕后,按逆序调用拦截器的 postHandle 方法。

Ø 渲染视图:视图渲染(如返回 JSON 或 JSP)。

Ø 执行 afterCompletion:最终按逆序调用拦截器的 afterCompletion 方法,用于资源清理。

特性拦截器 (Interceptor)过滤器 (Filter)作用范围Spring MVC 框架内,仅拦截 Controller 请求Servlet 规范,拦截所有请求(包括静态资源)依赖依赖于 Spring 容器依赖于 Servlet 容器(如 Tomcat)实现方式实现 HandlerInterceptor 接口实现 javax.servlet.Filter 接口执行时机Controller 方法前后、视图渲染前后请求进入 Servlet 前、响应返回前

应用场景

权限验证:在 preHandle 中检查用户登录状态。日志记录:记录请求参数、响应时间等。性能监控:统计 Controller 方法的执行时间。通用参数处理:如解析 Token、设置线程局部变量。

总结

Spring 拦截器通过 HandlerInterceptor 接口和 DispatcherServlet 的调度机制,在请求处理的关键节点插入自定义逻辑。其核心优势在于与 Spring 生态的无缝集成,适合处理与业务逻辑紧密相关的横切关注点(如鉴权、日志)。对于更底层的请求处理(如编码转换、跨域处理),建议使用过滤器(Filter)。

来源:老客数据一点号

相关推荐