SpringBoot拦截方式
拦截方式
- Filter: 过滤器,与框架无关,粒度最大
- 配置方式:
- 定义一个类实现 Filter 接口及其定义的所有方法,加上 @Component 注解,让容器管理,拦截所有的URL,配合 @Order 注解设置执行顺序
- 定义一个类实现 Filter 接口及其定义的所有方法,加上 @WebFilter 注解可以匹配指定URL,通过类名来确定执行顺序,但是要配合 @ServletComponentScan 注解,能够让容器管理
- 定义一个类实现 Filter 接口及其定义的所有方法,@Configuration 定义配置类,定义返回类型是 FilterRegistrationBean 的方法,该方法加上 @Bean 注解,让容器管理,能够自定义拦截URL,设置执行顺序,方式灵活
- 定义一个类继承 OncePerRequestFilter 并重写 doFilterInternal() 方法,通过类名来确定执行顺序,加上 @Component 注解,让容器管理
- 配置方式:
- Interceptor: 拦截器,框架提供
- 配置方式: 自定义类实现 HandlerInterceptor 接口,实现相关方法
(继承抽象类 HandlerInterceptorAdapter 的方式已经弃用),定义一
个配置类实现 WebMvcConfigurer 接口并重写 addInterceptors()
方法注册拦截器
- 配置方式: 自定义类实现 HandlerInterceptor 接口,实现相关方法
- 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