spring拦截机制

发布于:2025-06-17 ⋅ 阅读:(11) ⋅ 点赞:(0)

1、概述

        在 Spring 框架中,常见的拦截机制主要包括 Servlet FilterSpring MVC 的 HandlerInterceptorSpring 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周围


网站公告

今日签到

点亮在社区的每一天
去签到