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

相关文章
|
安全 API 数据安全/隐私保护
基于 Token 的多平台身份认证架构设计
在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情。 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N 个客户端的格局 。
基于 Token 的多平台身份认证架构设计
|
存储 数据处理 开发工具
用python制作好的软件放手机里
【4月更文挑战第7天】
854 4
|
XML Java 项目管理
java maven 和gradle哪种好
java maven 和gradle哪种好
516 0
|
2月前
|
人工智能 安全 Java
企业级Agent治理落地三步法:从0到1破解技能孤岛
本文提出Java企业AI Agent治理“三步法”:一、调研摸清现状与技能资产;二、搭建统一授权+技能共享体系,筑牢安全底线、破除孤岛;三、以度量驱动持续优化。基于JBoltAI Agent OS实践,兼顾个体自主与企业合规,助力安全高效落地。(239字)
169 3
|
2月前
|
人工智能 自然语言处理 运维
OpenClaw是什么?使用OpenClaw龙虾AI助手能干什么?
OpenClaw(龙虾)是阿里云推出的开源AI智能体,不止聊天,更能自动办公、写代码、管日程、控家居、整知识库等。零门槛一键部署,支持多端使用,让AI真正帮你干活。(239字)
|
6月前
|
Web App开发 JavaScript 前端开发
SpringBoot.跨域处理
跨域指协议、域名、端口不同时的资源请求限制。本文详解CORS解决方案,包括@CrossOrigin注解、全局配置WebMvcConfigurer及Filter拦截器实现,支持指定域名跨域访问,保障前后端分离架构下安全通信。
287 2
|
数据采集 前端开发 Java
@ControllerAdvice:你可以没用过,但是不能不了解
`@ControllerAdvice` 是 Spring MVC 中用于定义全局行为的注解,如异常处理、数据绑定和预处理。它从 `@Component` 派生,确保被扫描并纳入容器。`@ExceptionHandler` 用于全局异常处理,提供统一的错误响应。例如,当处理不当的异常时,它能返回友好的错误信息。`@InitBinder` 在数据绑定前对参数进行处理,如格式转换。`@ModelAttribute` 可以用于全局绑定模型属性,如登录用户信息。Spring MVC 通过 `DispatcherServlet` 和 `HandlerAdapter` 在请求处理流程中应用这些全局配置。
1190 3
@ControllerAdvice:你可以没用过,但是不能不了解
|
消息中间件 存储 负载均衡
2024消息队列“四大天王”:Rabbit、Rocket、Kafka、Pulsar巅峰对决
本文对比了 RabbitMQ、RocketMQ、Kafka 和 Pulsar 四种消息队列系统,涵盖架构、性能、可用性和适用场景。RabbitMQ 以灵活路由和可靠性著称;RocketMQ 支持高可用和顺序消息;Kafka 专为高吞吐量和低延迟设计;Pulsar 提供多租户支持和高可扩展性。性能方面,吞吐量从高到低依次为
7290 1
|
分布式计算 数据处理 流计算
【原理】Flink如何巧用WaterMark机制解决乱序问题
【原理】Flink如何巧用WaterMark机制解决乱序问题
|
关系型数据库 MySQL 数据库
测试部署PolarDB-X 分布式与集中式
在本文中,作者详述了在CentOS 7.9上部署测试PolarDB-X分布式与集中式数据库的过程。PolarDB-X作为阿里云优化的分布式数据库,提供高稳定性和与MySQL的兼容性,是应对单体数据库扩展性和性能瓶颈的解决方案,同时也符合国产化需求。文章介绍了部署环境准备,包括关闭防火墙和SELinux,设置系统参数,安装Python3和Docker,以及配置MySQL客户端。接着,通过PXD工具部署了PolarDB-X的集中式和分布式版,遇到的问题包括阿里云镜像源异常导致的部署失败以及指定版本安装的困扰。最后,作者进行了初步的压力测试,并对文档完善、生态工具建设以及提供更多使用案例提出了建议。
49055 10
测试部署PolarDB-X 分布式与集中式