controlleradvice和handlerinterceptor

2023-10-22 23:28

本文主要是介绍controlleradvice和handlerinterceptor,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里写自定义目录标题

    • 介绍
    • @InitBinder和preHandle
    • 使用场景

介绍

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更好用,还能顺手把异常也处理了。

这篇关于controlleradvice和handlerinterceptor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/264248

相关文章

spring使用@ExceptionHandler、@ControllerAdvice统一异常处理

1. 自己定义的异常,继承RuntimeException。可以建个exception包,专门放自定义异常。自定义的异常用来描述自己程序中特有的异常。 public class CustomGenericException extends RuntimeException {     private String errCode;     private String e

Spring Boot 全局异常@ControllerAdvice和@RestControllerAdvice的区别

在Spring Boot中,@ControllerAdvice和@RestControllerAdvice都可以用于实现全局异常处理,但它们在处理方式和返回值类型上略有不同。至于为什么在某些情况下可能更偏向于使用@RestControllerAdvice而不是@ControllerAdvice,这主要取决于你的应用类型和需求。 主要区别 返回值类型: @ControllerAdvice:主要用

@ControllerAdvice:你可以没用过,但是不能不了解

1.概述 最近在梳理Spring MVC相关扩展点时发现了@ControllerAdvice这个注解,用于定义全局的异常处理、数据绑定、数据预处理等功能。通过使用 @ControllerAdvice,可以将一些与控制器相关的通用逻辑提取到单独的类中进行集中管理,从而减少代码重复,提升代码的可维护性。 定义如下 /*** Specialization of {@link Component @

Spring3.2新注解@ControllerAdvice

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 @ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:   Java代码   @Target(ElementType.TYPE)  @Retention(RetentionPo

SpringMVC重要注解(二)@ControllerAdvice

@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。让我们先看看@ControllerAdvice的实现:   package org.springframework.web.bind.annotation; @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Docu

拦截器(二):使用@ControllerAdvice与@ExceptionHandler拦截异常

1.@ControllerAdvice注解 @ControllerAdvice是控制器增强注解。可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。   启动应用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在 被 @Requ

五十、Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片

Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片 上图为在web项目中,在处理request请求时得处理顺序 在项目中我们改怎么使用呢?  Filter过滤器 /*** Created by GAOMINGQIAN on 2017/12/10.*<pr>* Filter只能获取到请求的request和response。获取不到

Filter 和 HandlerInterceptor 的执行顺序

Filter 和 HandlerInterceptor 的执行顺序 在 Spring 框架中,Filter 和 HandlerInterceptor 的执行顺序如下: Filter(过滤器): Filter 是 Java Servlet 规范中定义的组件,用于在请求进入 Servlet 之前或响应返回给客户端之前执行特定操作。Filter 在 Web 应用程序中全局生效,可以对

HandlerInterceptor 拦截器,生成dongtai token

// 实现拦截器@Componentpublic class loginCheckInterceptor implements HandlerInterceptor {@Override //目标方法运行前执行,public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object ha