Interceptor(拦截器) 是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:
与 Filter 的区别:
| 特性 | Interceptor(拦截器) | Filter(过滤器) |
|---|---|---|
| 作用范围 | 针对 Spring MVC 的控制器层 | 作用于 Servlet 容器层面 |
| 依赖框架 | Spring MVC 管理 | Servlet 原生规范 |
| 数据访问 | 可操作 ModelAndView | 仅能操作 HttpServletRequest/Response。 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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) { // 请求完成后处理(如资源清理) } } |
|
1 2 3 4 5 6 7 8 9 |
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**") // 拦截路径 .excludePathPatterns("/login"); // 排除路径 } } |
假设注册了 Interceptor1 和 Interceptor2:
中断场景:若某一拦截器的 preHandle 返回 false,后续拦截器和控制器均不执行,但已通过 preHandle 的拦截器的 afterCompletion 仍会执行。
权限校验
在 preHandle 中检查用户登录状态或角色权限,拒绝非法请求。
|
1 2 3 4 |
if (request.getSession().getAttribute("user") == null) { response.sendRedirect("/login"); return false; } |
日志记录
记录请求路径、参数、耗时等信息:
|
1 2 3 |
long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime); // 在 afterCompletion 中计算耗时 |
性能监控
统计接口响应时间,优化慢请求。
数据预处理
在 postHandle 中统一添加响应头或加密敏感数据。
性能优化
常见问题排查
与 AOP 结合
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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()); } } |
|
1 2 3 4 5 6 7 8 9 10 |
@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 的分阶段处理,能有效提升代码复用性和可维护性。