1、概述
在 Spring 框架中,常见的拦截机制主要包括 Servlet Filter、Spring MVC 的 HandlerInterceptor 和 Spring AOP 的 Aspect。这些拦截机制在不同的层次和阶段对请求或方法调用进行拦截,以实现诸如权限验证、日志记录、性能监控、事务管理等功能。
2、Servlet Filter(过滤器)
定位:J2EE标准组件,不属于Spring,但可与Spring集成。
作用范围:拦截所有HTTP请求/响应,作用于Servlet容器层面(早于Spring)。
典型用途:
全局日志记录。
跨域处理(CORS)。
请求/响应编码设置(如CharacterEncodingFilter)。
执行顺序:通过@Order或web.xml配置,优先级最高。
示例代码
@Component
@Order(1)
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
System.out.println("Filter前置处理");
chain.doFilter(request, response); // 放行请求
System.out.println("Filter后置处理");
}
}
3、Spring MVC Interceptor(拦截器)
- 定位:Spring MVC组件,基于DispatcherServlet的请求处理流程。
- 作用范围:拦截Controller层的请求(需匹配路径)。
- 核心方法:
- preHandle():Controller方法执行前。
- postHandle():Controller方法执行后,视图渲染前。
- afterCompletion():请求完成后(视图渲染完毕)。
- 典型用途:
- 权限校验(如登录检查)。
- 接口耗时统计。
- 参数预处理。
- 执行顺序:通过WebMvcConfigurer注册,支持order()方法排序。
示例代码
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("Interceptor前置检查");
return true; // 返回false则中断请求
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**").order(1);
}
}
4、AOP(面向切面编程)
- 定位:Spring AOP模块,基于动态代理(JDK/CGLIB)。
- 作用范围:拦截方法调用(如Service/Controller层方法)。
- 核心注解:
- @Before / @After / @Around / @AfterThrowing。
- 需配合切点表达式(如@Pointcut("execution(* com.example.service.*.*(..))"))。
- 典型用途:
- 事务管理(@Transactional底层实现)。
- 日志记录。
- 性能监控。
- 执行顺序:通过@Order注解控制(值越小优先级越高)。
示例代码
@Aspect
@Component
@Order(10)
public class LogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("AOP方法调用前");
Object result = pjp.proceed();
System.out.println("AOP方法调用后");
return result;
}
}
5、其他
ControllerAdvice(全局异常/数据拦截)
- 定位:Spring MVC的全局增强组件。
- 作用范围:
- @ExceptionHandler:拦截Controller层异常。
- @ModelAttribute / @InitBinder:预处理请求数据。
- 典型用途:
- 全局异常处理(如统一返回错误格式)。
- 参数校验或数据绑定。
示例代码
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return ResponseEntity.status(500).body("全局异常: " + e.getMessage());
}
}
6、对比
执行顺序
1.Filter → 2. Interceptor → 3. AOP → 4. Controller
如何选择
机制 | 适用场景 | 粒度 | 执行阶段 |
---|---|---|---|
Filter | 全局请求/响应处理(如安全、编码) | 粗粒度 | Servlet容器层面 |
Interceptor | Controller层拦截(如权限、日志) | 中粒度 | Spring MVC流程 |
AOP | 方法级拦截(如事务、性能监控) | 细粒度 | Spring Bean方法 |
ControllerAdvice | 全局异常或数据预处理 | 全局 | Controller周围 |