sprinboot使用自定义注解切面 aop aspectj

news2024/11/29 0:52:10

sprinboot使用自定义注解切面

  • 主要依赖
  • 定义注解接口
  • 定义切面
  • 使用注解
  • 打印切面获取参数

主要依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--切面依赖 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
		</dependency>

定义注解接口

/**
 * 次数限制注解, 作用在接口方法上
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitCount {
	/** 资源名称,用于描述接口功能 */
	String name() default "";
	/**  资源 key */
	String key() default "";
	/** key prefix */
	String prefix() default "";
	/** 时间的,单位秒, 默认60s过期 */
	int period() default 60;
	/** 限制访问次数,默认3次  */
	int count() default 3;
}

定义切面

@Slf4j
@Aspect
@Component
public class LimitCountAspect {
	@Pointcut("@annotation(zzc.learn.springboot.annodemo.annotation.LimitCount)")
	public void pointcut() {
		// do nothing
	}
	@Around("pointcut()")
	public Object around(ProceedingJoinPoint point) throws Throwable {
		MethodSignature signature = (MethodSignature)point.getSignature();
		Method method = signature.getMethod();
		LimitCount limitCount = method.getAnnotation(LimitCount.class);
		log.info("limitCount为 {}", limitCount);
		// log.info("IP:{}", IPUtil.getIpAddr());
		// 调用对象
		Object target = point.getTarget();
		log.info("调用对象:{}", target);
		Object[] args = point.getArgs();
		log.info("参数: {}", Arrays.toString(args));
		// TODO 业务处理
		return point.proceed();
	}
}

使用注解

@Api(value = "切面注解", tags = {"切面注解"})
@RequestMapping("/anno")
@RestController
@Slf4j
public class AopAnnotationController {
	@GetMapping("/login")
	@ApiOperation(value = "登录", notes = "登录")
	@LimitCount(key = "login", name = "登录接口", prefix = "limit")
	public String login(
			@RequestParam(required = true) String deviceId,
			@RequestParam(required = true) String username,
			@RequestParam(required = true) String password,
			HttpServletRequest request) throws Exception {
		if (StringUtils.equals("张三", username) && StringUtils.equals("123456", password)) {
			return "登录成功";
		}
		return "账户名或密码错误";
	}
}

打印切面获取参数

在这里插入图片描述

limitCount: @zzc.learn.springboot.annodemo.annotation.LimitCount(name=登录接口, count=3, period=60, prefix=limit, key=login)
调用对象: zzc.learn.springboot.annodemo.controller.AopAnnotationController@2f5fceb6
参数:  [deviceId001, Tony, mypassword, org.apache.catalina.connector.RequestFacade@14e2d2f]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列预测:深度学习、机器学习、融合模型、创新模型实战案例(附代码+数据集+原理介绍)

本文介绍->给大家推荐一下我的时间序列预测实战专栏&#xff0c;本专栏平均质量分98分&#xff0c;而且本专栏目前免费阅读。其中涉及机器学习、深度学习、融合模型、个人创新模型、数据分析等一系列有关时间序列的内容&#xff0c;其中的实战案例不仅有简单的模型类似于机器…

STM32F407-Discovery的硬件FPU

本文基于STM32 HAL 库版本&#xff1a;STM32Cube_FW_F4_V1.27.0 1. STM32F407的FPU简介 FPU&#xff1a;Float Point Unit&#xff0c;也就是浮点运算单元。如果是定点 CPU&#xff08;没有 FPU 的 CPU&#xff09;计算浮点数&#xff0c;则按照 IEEE-754 标准&#xff0c;完…

UltraEdit v22.0.0.19(高级文本编辑器)

UltraEdit是一款多功能文本编辑器&#xff0c;该软件功能强大&#xff0c;界面友好&#xff0c;使用方便&#xff0c;支持语法高亮、代码折叠、宏等高级功能&#xff0c;适用于编辑文本、十六进制、ASCII码等多种类型的文件。 UltraEdit v22.0.0.19(高级文本编辑器) UltraEd…

硬盘有未分配空间C盘扩展卷却显示灰色不能扩展

买的惠普暗影精灵9新电脑&#xff0c;512G硬盘&#xff0c;回来后我寻思把盘分成三个盘&#xff0c;没注意点到哪了发现C盘就剩下了10G还有200多G未分配的空间&#xff0c;但C盘却无法扩展卷&#xff08;如下图&#xff09;。问了之前一个老哥后才知道是因为C盘和未分配磁盘直接…

ASO优化之如何进行ios和Android关键词研究1

应用商店优化包含许多不同子领域&#xff0c;其中之一就是关键词研究。适当的关键词研究会将应用带入应用程序商店的搜索结果中&#xff0c;并且搜索排名会产生免费的自然下载。 1、准备关键词研究。 为了让研究打下坚实的基础&#xff0c;需要创建一个框架。拿一张纸或制作一…

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote

一篇文章带你全面了解智能地面水处理一体机

一、智能地面水处理一体机 1、设备外壳常规尺寸有&#xff1a;1630*760*560&#xff08;mm&#xff09;&#xff1b;1630*900*560&#xff08;mm&#xff09; 2、外壳有不锈钢、碳钢材质 二、产品构成&#xff08;电气控制柜雨水过滤、消毒处理机&#xff09; 1. 上半部为雨…

如何爬取 python 进行多线程跑数据的内容

下是一个使用 Rust 编写的爬虫程序&#xff0c;用于爬取 python 进行多线程跑数据的内容。这个爬虫使用代理信息进行网络请求&#xff0c;并使用了 Rust 的 async-std 库进行异步编程。 use async_std::net::{TcpStream, TcpListener}; use async_std::io::{BufReader, BufWri…

webGL项目的开发流程

WebGL (Web Graphics Library) 是一种用于在网页上渲染 2D 和 3D 图形的 JavaScript API。下面是创建 Web 应用程序中使用 WebGL 的流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 了解 WebGL&am…

什么是Node.js的NVM(Node Version Manager)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

用Leangoo领歌免费敏捷工具做敏捷需求管理

传统的瀑布工作模式使用详细的需求说明书来表达需求&#xff0c;需求人员负责做需求调研&#xff0c;根据调研情况编制详细的需求说明书&#xff0c;进行需求评审&#xff0c;评审之后签字确认交给研发团队设计开发。在这样的环境下&#xff0c;需求文档是信息传递的主体&#…

巅峰对决:英伟达 V100、A100/800、H100/800 GPU 对比

近期&#xff0c;不论是国外的 ChatGPT&#xff0c;还是国内诸多的大模型&#xff0c;让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后&#xff0c;均来自于堪称天文数字的算力支持。以 ChatGPT 为例&#xff0c;据微软高管透露&#xff0c;为 ChatGPT 提供算力支持的 A…

想水目标检测sci论文的同学看过来:第一个用于目标检测的扩散模型

目标检测新范式&#xff01;在 COCO、CrowdHuman 和 LVIS上取得了良好的性能&#xff0c;尤其是跨不同场景的零样本迁移 本文提出了 DiffusionDet&#xff0c;这是一个新框架&#xff0c;它将目标检测制定为从噪声框到对象框的去噪扩散过程。 在训练阶段&#xff0c;目标框从真…

Verilog 之 wire与reg 类型的变量

文章目录 reg 类型wire 类型总结默认情况下的input ,output 变量 在 Verilog 中&#xff0c;reg 和 wire 是用来声明变量或信号的关键字&#xff0c;它们有不同的特征和用途。 reg 类型 reg 类型用于表示寄存器变量。在 Verilog 中&#xff0c;reg 用于存储状态或时序逻辑&am…

数据库索引详解

目录 第一章、快速了解索引1.1&#xff09;索引是什么1.2&#xff09;为什么使用索引1.3&#xff09;快速上手创建简单索引 第二章、索引分类2.1&#xff09;按数据结构分类2.1.1&#xff09;树型数据结构的索引①二叉树②B树③B 树&#xff1a;B 树的升级版 2.1.2&#xff09;…

Node.js中的回调地狱

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Go - 用户服务和Web服务

文章目录 go日志库之zap1. 安装和基本使用2. 写入日志文件 go的配置文件管理-viper1. 介绍2. yaml教程3. 安装4. 将配置文件映射成struct5. 使用 自定义验证器1. 手机号码正则表达式2. 自定义翻译的问题 JWT1. json web token是什么&#xff1f;2. 什么时候你应该用JSON Web To…

5 个 Python 代码来自动化你的日常工作,网友:早知道就好了

1、从Word里提取所有图片 1行代码&#xff0c;提取Word中的图片。 需要强调的是&#xff1a;这个功能需求不仅来自课程群&#xff0c;就连代码都是课程群里王鹏大哥开发的&#xff0c;我们这套课程针对小白入门Python&#xff0c;看来是有效果的。 安装第三方库 pip instal…

倒计时1天|GitHub Universe 2023 明天见!

点击蓝字 关注我们 北京时间 11月9 - 10日&#xff0c;全球开发者盛会——GitHub Universe 正式回归&#xff01; 本次 GitHub Universe 汇集了世界各地的开发者、企业领导者和安全专业人士&#xff0c;就人工智能、安全和开发者体验进行为期两天的互动会议&#xff0c;学习如何…

铁路数据调度采集RTU远程终端钡铼技术S270使用

钡铼技术有限公司的S270 RTU远程终端在铁路数据调度采集系统中扮演着关键角色。该系统通过使用先进的通信技术和数据处理能力&#xff0c;实现对铁路运营数据的实时采集、传输、监控和分析。这有助于提高铁路运输的效率和安全性&#xff0c;优化调度指挥&#xff0c;并为决策提…