1. 拦截器与切面:两种不同的横切逻辑实现方式
在SpringBoot应用中,拦截器(Interceptor)和面向切面编程(AOP)都是处理横切关注点的常用技术,但它们的实现机制和适用场景有着本质区别。理解这些差异对于设计清晰的系统架构至关重要。
拦截器是Spring MVC框架的一部分,它基于Java的反射机制,通过实现HandlerInterceptor接口来工作。拦截器主要作用于Controller层,可以在请求处理的前后插入自定义逻辑。它的核心方法是preHandle(处理前)、postHandle(处理后)和afterCompletion(完成后)。
java复制public class CustomInterceptor 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) {
// 请求处理后的逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 请求完成后的清理逻辑
}
}
AOP则是一种更通用的编程范式,它通过代理模式在方法调用前后插入横切逻辑。Spring AOP主要使用基于代理的实现,支持前置通知(@Before)、后置通知(@After)、返回通知(@AfterReturning)、异常通知(@AfterThrowing)和环绕通知(@Around)五种通知类型。
java复制@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {
// 方法执行前的逻辑
Object result = joinPoint.proceed(); // 执行目标方法
// 方法执行后的逻辑
return result;
}
}
关键区别在于:
- 拦截器只能拦截Controller的请求,而AOP可以应用于任何Spring管理的Bean
- 拦截器可以获取HttpServletRequest和HttpServletResponse对象,AOP通常不能
- AOP提供了更细粒度的控制,可以在方法级别进行拦截
- 拦截器的执行顺序可以通过Order注解或实现Ordered接口来控制,而AOP的通知顺序由通知类型决定
提示:在实际项目中,如果需要对HTTP请求/响应进行处理,优先考虑拦截器;如果需要对业务方法进行拦截,则使用AOP更合适。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 拦截器的典型应用场景与实现
拦截器在Web开发中有着广泛的应用场景,特别是在需要处理HTTP请求和响应的场景下。以下是几种常见的拦截器使用案例:
2.1 认证与授权拦截器
认证授权是拦截器最典型的应用场景之一。通过拦截器,我们可以在请求到达Controller之前验证用户的身份和权限。
java复制public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (!validateToken(token)) {
response.sendError(HttpStatus.UN
