Spring Boot拦截器通过AOP机制实现业务逻辑与横切关注点的高效解耦,显著提升代码复用性与可维护性。其核心优势体现在三方面:其一,全生命周期管控能力,通过preHandle(预处理)、postHandle(响应调整)、afterCompletion(后置清理)精准覆盖请求处理各阶段,支持权限校验、日志记录等统一管理;其二,灵活的路由匹配策略,基于Ant规则可定向拦截接口(如/api/**)并排除静态资源,避免冗余拦截;其三,低侵入式扩展,多拦截器链式调用支持顺序控制,结合Spring依赖注入无缝集成业务组件,在保障系统高内聚的同时,实现身份认证、性能监控等功能的快速扩展。相较于Servlet过滤器,拦截器深度融入Spring生态,兼具轻量级与高扩展性,成为构建规范化、模块化企业级应用的核心工具。
在Java Spring Boot框架中,拦截器(Interceptor)是用于在请求处理的不同阶段(如请求到达Controller前、Controller处理完成后等)添加通用逻辑的组件。以下是详细的使用方法和注意事项:
一、拦截器的核心方法
实现HandlerInterceptor接口并重写以下方法(通常按需选择):
public class CustomInterceptor implements HandlerInterceptor {
// 在Controller方法执行前调用(常用)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 返回true继续流程,返回false中断请求
return true;
}
// 在Controller方法执行后、视图渲染前调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 可修改ModelAndView数据
}
// 在整个请求完成后调用(包括视图渲染)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 适合资源清理或日志记录
}
}
二、注册拦截器到Spring Boot
通过配置类实现WebMvcConfigurer并注册拦截器:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/login"); // 排除特定路径
}
}
三、注意事项
1. 执行顺序
- 多个拦截器:
preHandle按注册顺序执行,postHandle和afterCompletion按逆序执行。 - 中断处理:若某个拦截器的
preHandle返回false,后续拦截器和Controller均不会执行,但已通过preHandle的拦截器的afterCompletion仍会执行。
2. 路径匹配规则
- 使用Ant风格路径:
/**:匹配所有路径(包括子路径)/api/*:匹配单级路径(如/api/user)/static/**:匹配多级路径
- 避免过度拦截静态资源,可通过
excludePathPatterns排除。
3. 性能影响
- 避免在拦截器中执行耗时操作(如远程调用),建议异步处理或缓存。
4. 与过滤器的区别
- 过滤器(Filter):Servlet层面,更底层,无法直接使用Spring Bean。
- 拦截器(Interceptor):Spring MVC层面,可访问Handler(Controller方法)和
ModelAndView。
5. 异常处理
- 若在拦截器中抛出异常,需配合
@ControllerAdvice全局异常处理。 afterCompletion方法中的Exception ex参数可捕获Controller抛出的异常。
6. 静态资源拦截
- 默认情况下,Spring Boot的静态资源处理可能绕过拦截器。若需拦截,确保配置正确:
registry.addInterceptor(...) .addPathPatterns("/**") .excludePathPatterns("/css/**", "/js/**");
7. 依赖注入
- 若拦截器需要注入Spring Bean,需通过
@Component将其声明为Bean,并在注册时从Spring容器获取:@Autowired private CustomInterceptor interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(interceptor); }
8. 避免循环依赖
- 如果拦截器依赖其他Bean,确保这些Bean不会间接依赖拦截器本身。
四、典型应用场景
- 身份认证:在
preHandle中验证Token或Session。 - 日志记录:记录请求参数、响应时间(结合
preHandle和afterCompletion)。 - 参数预处理:统一修改请求参数(如敏感词过滤)。
- 性能监控:统计接口耗时。
五、示例:鉴权拦截器
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("Authorization");
if (!validateToken(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false; // 中断请求
}
return true;
}
private boolean validateToken(String token) {
// 实现Token验证逻辑
return true;
}
}
六、常见问题
1. 拦截器不生效
- 检查是否遗漏 @Component 注解或未正确注册到 InterceptorRegistry。
- 确认拦截路径是否与请求URL匹配(如大小写敏感问题)。
2. 静态资源被拦截
- 显式排除静态资源路径(如 /static/**)或调整拦截规则
3. 循环重定向
- 登录校验拦截器需排除登录页自身路径,避免未登录时重定向到登录页再次触发拦截。
通过合理使用拦截器,可以有效实现横切关注点的复用,提升代码的可维护性。注意根据具体需求选择拦截器或过滤器,并遵循最佳实践以避免性能和安全问题。

300

被折叠的 条评论
为什么被折叠?



