SpringBoot拦截方式

拦截方式

  • Filter: 过滤器,与框架无关,粒度最大
    • 配置方式:
      1. 定义一个类实现 Filter 接口及其定义的所有方法,加上 @Component 注解,让容器管理,拦截所有的URL,配合 @Order 注解设置执行顺序
      2. 定义一个类实现 Filter 接口及其定义的所有方法,加上 @WebFilter 注解可以匹配指定URL,通过类名来确定执行顺序,但是要配合 @ServletComponentScan 注解,能够让容器管理
      3. 定义一个类实现 Filter 接口及其定义的所有方法,@Configuration 定义配置类,定义返回类型是 FilterRegistrationBean 的方法,该方法加上 @Bean 注解,让容器管理,能够自定义拦截URL,设置执行顺序,方式灵活
      4. 定义一个类继承 OncePerRequestFilter 并重写 doFilterInternal() 方法,通过类名来确定执行顺序,加上 @Component 注解,让容器管理
  • Interceptor: 拦截器,框架提供
    • 配置方式: 自定义类实现 HandlerInterceptor 接口,实现相关方法
      (继承抽象类 HandlerInterceptorAdapter 的方式已经弃用),定义一
      个配置类实现 WebMvcConfigurer 接口并重写 addInterceptors()
      方法注册拦截器
  • ControllerAdvice: 控制器增强,一般配合 @ExceptionHandler 注解
    进行全局异常处理,也可以配合实现 ResponseBodyAdvice 接口对
    @ResponseBody 注解返回的数据加工处理再返回(RequestBodyAdvice
    接口和 @RequestBody 注解同理,接口有一个 RequestBodyAdviceAdapter
    适配器类)
  • Aspect: 自定义切入的类或者方法,粒度最小

简单总结

\ Filter Interceptor ControllerAdvice Aspect
参数 ServletRequest request, ServletResponse response, FilterChain chain HttpServletRequest request, HttpServletResponse response, Object handler \ ProceedingJoinPoint joinPoint
总结 可以拿到Http请求,但无法获取控制器 可以拿到请求的控制器和方法,但拿不到请求方法里的参数 \ 拿得到方法的参数,但是拿不到Http请求和响应对象,可以通过RequestContextHolder获得

同时使用所有的拦截方式,拦截顺序
Filter -> Interceptor -> ControllerAdvice -> Aspect -> Controller