controlleradvice和handlerinterceptor

简介: controlleradvice和handlerinterceptor


介绍

controlleradvice和handlerinterceptor都是Spring框架中的组件,其首次出现的Spring版本如下:

  1. @ControllerAdvice

@ControllerAdvice注解是在Spring 3.2 中作为@ExceptionHandler、@InitBinder 和@ModelAttribute的组合形式引入的,用来定义@ExceptionHandler、@InitBinder、@ModelAttribute修饰的方法适用于全局,这些方法会作用在所有的@RequestMapping注解的方法上。

  1. HandlerInterceptor

HandlerInterceptor接口是在Spring 3.0 中引入的,它可以实现类似Servlet的Filter过滤器功能,可以在请求处理的前后添加拦截器对请求进行预处理和后处理。

主要方法有:

  • preHandle: 在请求处理之前调用
  • postHandle: 在请求处理之后调用
  • afterCompletion: 在整个请求结束之后调用

通过实现HandlerInterceptor接口,然后注册拦截器至Spring的HandlerMapping中,这样这个拦截器就会生效。

所以综上:

  • @ControllerAdvice 是Spring 3.2新增
  • HandlerInterceptor 是Spring 3.0新增

它们都可以实现一些全局的、跨切面请求处理的功能,如异常处理、参数校验等,但设计思想和使用场景有所不同。@ControllerAdvice更侧重异常处理,而HandlerInterceptor更灵活,可以在请求处理过程的多个点进行拦截。

@InitBinder和preHandle

@ControllerAdvice中的@InitBinder方法可以达到和HandlerInterceptor的preHandle方法类似的效果。

@InitBinder用来初始化WebDataBinder,用于请求参数绑定到模型对象。@InitBinder标注的方法会应用到所有@RequestMapping注解的方法上。

而HandlerInterceptor的preHandle方法也是在@RequestMapping方法执行之前执行的,所以通过@InitBinder可以在请求处理方法执行前,提前完成一些初始化操作,例如:

  1. 将请求参数转换成模型对象
  2. 参数验证
  3. 初始化一些共用的对象到请求域中
  4. 预处理请求参数

这样就避免了在每个控制器方法中重复书写这些初始化逻辑。

但是@InitBinder只能在请求处理前初始化,而不能在请求处理后执行。如果需要在请求处理后执行逻辑,还需要用到HandlerInterceptor的postHandle方法。

所以两者可以很好地配合使用:

  • @InitBinder负责请求预处理
  • HandlerInterceptor的preHandle和postHandle负责拦截前后处理

通过他们的配合可以完成参数绑定、验证、预处理以及拦截前后处理等功能。

使用场景

我们的接口在header中传了用户id,所以想要统一处理一下,获取到这个信息给后面的各层使用,一开始使用的handlerintercepter,后来发现controlleradvice更好用,还能顺手把异常也处理了。

目录
相关文章
|
4月前
|
Java Spring
@PostConstruct注解的使用
@PostConstruct注解的使用
101 0
|
6月前
|
Java 容器 Spring
HandlerInterceptor拦截器的原理
HandlerInterceptor拦截器的原理
66 0
|
6月前
|
Java Spring
spring的两种拦截器HandlerInterceptor和MethodInterceptor
spring的两种拦截器HandlerInterceptor和MethodInterceptor
142 0
HttpServlet使用@WebServlet注解
HttpServlet使用@WebServlet注解
|
缓存 前端开发 Java
自定义拦截器实现
自定义拦截器实现
181 0
|
XML JSON 数据格式
@ResponseBody注解
@ResponseBody注解
|
Java Spring
@GetMapping注解
@GetMapping注解
|
存储 中间件 API
拦截器介绍和实际使用
拦截器介绍和实际使用
228 0