spring中Interceptor的使用小结
一、Interceptor 的核心概念
Interceptor(拦截器) 是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:
- 预处理:在控制器方法执行前进行权限校验、日志记录等。
- 后处理:在控制器方法执行后修改响应数据或记录结果。
- 资源清理:在整个请求完成后释放资源或处理异常。
与 Filter 的区别:
| 特性 | Interceptor(拦截器) | Filter(过滤器) |
|---|---|---|
| 作用范围 | 针对 Spring MVC 的控制器层 | 作用于 Servlet 容器层面 |
| 依赖框架 | Spring MVC 管理 | Servlet 原生规范 |
| 数据访问 | 可操作 ModelAndView | 仅能操作 HttpServletRequest/Response。 |
二、Interceptor 的创建与配置
- 实现拦截器类
继承HandlerInterceptor接口,重写以下方法:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 请求前处理(如权限校验)
return true; // 返回 false 中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 控制器执行后、视图渲染前处理(如修改 Model 数据)
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 请求完成后处理(如资源清理)
}
}
- 注册拦截器
通过WebMvcConfigurer的addInterceptors方法配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/api/**") // 拦截路径
.excludePathPatterns("/login"); // 排除路径
}
}
- 路径匹配规则:支持 Ant 风格(如
/user/*匹配单层路径,/admin/**匹配多级路径)。 - 多拦截器顺序:通过
Order注解或实现Ordered接口控制优先级,值越小优先级越高。
三、拦截器的执行顺序
假设注册了 Interceptor1 和 Interceptor2:
- preHandle 方法:按注册顺序执行(Interceptor1 → Interceptor2)。
- postHandle 方法:按注册逆序执行(Interceptor2 → Interceptor1)。
- afterCompletion 方法:按注册逆序执行(Interceptor2 → Interceptor1)。
中断场景:若某一拦截器的 preHandle 返回 false,后续拦截器和控制器均不执行,但已通过 preHandle 的拦截器的 afterCompletion 仍会执行。
四、典型应用场景
权限校验
在preHandle中检查用户登录状态或角色权限,拒绝非法请求。if (request.getSession().getAttribute("user") == null) { response.sendRedirect("/login"); return false; }日志记录
记录请求路径、参数、耗时等信息:long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); // 在 afterCompletion 中计算耗时性能监控
统计接口响应时间,优化慢请求。数据预处理
在postHandle中统一添加响应头或加密敏感数据。
五、注意事项与最佳实践
性能优化
- 避免在拦截器中执行耗时操作(如远程调用)。
- 合理设置拦截路径,减少不必要的拦截。
常见问题排查
- 拦截器未生效:检查路径匹配规则、是否注册到 Spring 容器。
- 顺序混乱:通过
@Order明确优先级。
与 AOP 结合
- 拦截器适用于请求生命周期中的横切逻辑,而 AOP 更适用于方法级别的切面(如事务管理)。
六、完整示例
- 日志拦截器
public class LogInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("请求开始: " + request.getRequestURI());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("请求完成: " + request.getRequestURI());
}
}
- 配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**")
.order(1); // 高优先级
}
}
总结
Spring Interceptor 是处理请求生命周期横切逻辑的利器,通过灵活配置路径和优先级,可实现权限控制、日志记录等通用功能。结合 preHandle、postHandle 和 afterCompletion 的分阶段处理,能有效提升代码复用性和可维护性。
到此这篇关于spring中Interceptor的使用小结的文章就介绍到这了,更多相关spring Interceptor使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- 深入解析Spring MVC中拦截器Interceptor的实现原理和应用场景
- Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析
- SpringBoot使用Mybatis-Plus中分页插件PaginationInterceptor详解
- Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)
- Spring Mvc中拦截器Interceptor用法解读
- Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)
- Spring拦截器之HandlerInterceptor使用方式
- Spring的拦截器HandlerInterceptor详解
- SpringMVC的处理器拦截器HandlerInterceptor详解
相关文章
SpringBoot application.yml和bootstrap.yml的区别
本文主要介绍了SpringBoot application.yml和bootstrap.yml的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-04-04
java后端把数据转换为树,map递归生成json树,返回给前端(后台转换)
这篇文章主要介绍了java后端把数据转换为树,map递归生成json树,返回给前端实例(后台转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2017-01-01
Java之注解@Data和@ToString(callSuper=true)解读
在使用Lombok库的@Data注解时,若子类未通过@ToString(callSuper=true)注明包含父类属性,toString()方法只打印子类属性,解决方法:1. 子类重写toString方法;2. 子类使用@Data和@ToString(callSuper=true),父类也应使用@Data2024-11-11
SpringBoot @DS注解实现多数据源配置以及问题解决办法
这篇文章主要给大家介绍了关于SpringBoot @DS注解实现多数据源配置以及问题解决办法,所谓多数据源就是一个Java EE项目中采用了不同数据库实例中的多个库,或者是同一个数据库实例中的多个不同库,需要的朋友可以参考下2023-11-11


最新评论