当前位置: 首页 > news >正文

Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存

1.新建操作类型枚举(这里的IEnum是我自定义的http请求拦截接口,不需要的话可以不用实现)

@Getter
@AllArgsConstructor
public enum OperationType implements IEnum<Integer> {/*** 注册*/SIGN_UP(0),/*** 密码登录*/LOGIN_BY_PWD(1),/*** 验证码登录*/LOGIN_BY_SMS(2),/*** 忘记密码*/FORGET_PWD(3),/*** 修改密码*/MODIFY_PWD(4);@JsonValueprivate final int code;@Overridepublic Integer getCode(){return code;}
}

2.新建校验注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SmsValidate {/*** 操作类型* @return*/OperationType operationType() default OperationType.LOGIN_BY_PWD;
}

3.创建验证码校验接口

public interface ISmsValidate {/*** 短信验证码手机号* @return*/String mobile();/*** 短信验证码内容* @return*/String smsCode();
}

4.controller方法请求参数,实现ISmsValidate接口

@Data
public class LoginBySmsDto implements ISmsValidate {@NotBlank(message = "用户名/手机号不能为空")@IsMobileprivate String username;@NotBlank(message = "短信验证码不能为空")private String code;@Overridepublic String mobile() {return this.getUsername();}@Overridepublic String smsCode() {return this.getCode();}
}

5.添加aop切面类

@Aspect
@Component
public class SmsValidateAop {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Pointcut(value = "@annotation(com.tfyt.common.annotation.SmsValidate)")public void pointCut(){}@Before(value = "pointCut()")public void before(JoinPoint joinPoint){SmsObj smsObj = getSmsObj(joinPoint);Object cacheCode = redisTemplate.opsForValue().get(RedisKeyConstant.CACHE_SMS_CODE + smsObj.getOperationType() + ":" + smsObj.getMobile());BusinessAssert.notTrue(Objects.equals(cacheCode,smsObj.getCode()),"手机验证码不正确");}@AfterReturning(value = "pointCut()")public void after(JoinPoint joinPoint){SmsObj smsObj = getSmsObj(joinPoint);redisTemplate.delete(RedisKeyConstant.CACHE_SMS_CODE + smsObj.getOperationType() + ":" + smsObj.getMobile());}@Data@AllArgsConstructor@NoArgsConstructorprivate static class SmsObj{private String mobile;private String code;private Integer operationType;}private SmsObj getSmsObj(JoinPoint joinPoint){MethodSignature signature = (MethodSignature) joinPoint.getSignature();SmsValidate annotation = signature.getMethod().getAnnotation(SmsValidate.class);BusinessAssert.isNull(annotation,"系统异常:未查询到注解");BusinessAssert.isNull(annotation.operationType(),"系统异常:未配置操作类型");Object[] args = joinPoint.getArgs();ISmsValidate arg = null;if(args[0] instanceof ISmsValidate){arg = (ISmsValidate) args[0];}BusinessAssert.isNull(arg,"请输入用户名和手机验证码");return new SmsObj(arg.mobile(), arg.smsCode(), annotation.operationType().getCode());}
}

6.往controller的方法上注解

@SmsValidate(operationType = OperationType.LOGIN_BY_SMS)

重启springboot项目,调用接口即可生效,校验通过后会自动删除redis缓存

补一个自定义断言类

public class BusinessAssert {public static void notTrue(boolean condition, String msg){isTrue(!condition, msg);}public static void isTrue(boolean condition, String msg){if(condition){throw new BusinessException(HttpStatus.BAD_REQUEST.value(),msg);}}public static void nonNull(Object object,String msg){if(null!=object){throw new BusinessException(HttpStatus.BAD_REQUEST.value(),msg);}}public static void isNull(Object object,String msg){if(null==object){throw new BusinessException(HttpStatus.BAD_REQUEST.value(),msg);}}public static void isCollectionEmpty(Collection<?> collection,String msg){if(collection == null || collection.isEmpty()){throw new BusinessException(HttpStatus.BAD_REQUEST.value(),msg);}}public static void isCollectionNotEmpty(Collection<?> collection,String msg){if(collection != null && !collection.isEmpty()){throw new BusinessException(HttpStatus.BAD_REQUEST.value(),msg);}}

相关文章:

Springboot+Aop用注解实现阿里云短信验证码校验,校验通过自动删除验证码缓存

1.新建操作类型枚举&#xff08;这里的IEnum是我自定义的http请求拦截接口&#xff0c;不需要的话可以不用实现&#xff09; Getter AllArgsConstructor public enum OperationType implements IEnum<Integer> {/*** 注册*/SIGN_UP(0),/*** 密码登录*/LOGIN_BY_PWD(1),/…...

无线物联网新时代,RFID拣货标签跟随潮流

拣选技术的演变历程&#xff0c;本质上是从人力操作向自动化、智能化转型的持续进程。近期&#xff0c;“货寻人”技术成为众多企业热烈追捧的对象&#xff0c;它可以根据企业的特定需求&#xff0c;从众多拣选方案中选出最优解。那么&#xff0c;在采用“货到人”拣选技术时&a…...

Java8 根据List实体中一个字段去重取最大值,并且根据该字段进行排序

1、前言 某个功能要求需要对一个list对象里数据按照股票分组&#xff0c;并且取分组涨跌幅最大的&#xff0c;返回一个新的list对象&#xff0c;并且按照涨跌幅字段进行排序&#xff0c;这么一连串的要求&#xff0c;如果按照传统的写法&#xff0c;我们需要写一大坨的代码&am…...

微服务经纬:Eureka驱动的分布式服务网格配置全解

微服务经纬&#xff1a;Eureka驱动的分布式服务网格配置全解 在微服务架构的宏伟蓝图中&#xff0c;服务网格&#xff08;Service Mesh&#xff09;作为微服务间通信的独立层&#xff0c;承担着流量管理、服务发现、故障恢复等关键任务。Eureka&#xff0c;Netflix开源的服务发…...

关于前端数据库可视化库的选择,vue3+antd+g2plot录课计划

之前&#xff1a;antdv 现在&#xff1a;g2plot https://g2plot.antv.antgroup.com/manual/introduction 录课内容&#xff1a;快速入门 图表示例&#xff1a; 选择使用比较广泛的示例类型&#xff0c;录课顺序如下&#xff1a; 1、折线图2、面积图3、柱形图4、条形图5、饼…...

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑&#xff0c;分别是A&#xff0c;B&#xff0c;现在我要把A电脑上的redis的数据迁移到B电脑上&#xff0c;B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis&#xff0c;一般来说&#xff0c;都是直接在linux的控制台输入&#xff1a;re…...

深入理解Scikit-learn:决策树与随机森林算法详解

用sklearn实现决策树与随机森林 1. 简介 决策树和随机森林是机器学习中的两种强大算法。决策树通过学习数据特征与标签之间的规则来进行预测&#xff0c;而随机森林则是由多棵决策树组成的集成算法&#xff0c;能有效提高模型的稳定性和准确性。 2. 安装sklearn 首先&#…...

AutoHotKey自动热键(十一)下载SciTE4AutoHotkey-Plus的中文增强版脚本编辑器

关于AutoHotkey的专用编辑器, SciTE4AutoHotkey是一个免费的基于 SciTE 的 AutoHotkey 脚本编辑器,除了 DBGp 支持, 它还为 AutoHotkey 提供了语法高亮, 调用提示, 参数信息和自动完成, 以及其他拥有的编辑特性和辅助工具.XDebugClient 是一个基于 .NET Framework 2.0 的简单开…...

Halcon与C++之间的数据转换

HALCON的HTuple类型(元组)功能很强大&#xff0c;可以表示INT、double、string等多种类型数据。当元组中只有一个成员时&#xff0c;HTuple也可表示原子类型 1. haclon -> C //HTuple转int HTuple hTuple 1; int data1 hTuple[0].I(); // data1 1//HTuple转do…...

MybatisPlus 一些技巧

查询简化 SimpleQuery 有工具类 com.baomidou.mybatisplus.extension.toolkit.SimpleQuery 对 selectList 查询后的结果进行了封装&#xff0c;使其可以通过 Stream 流的方式进行处理&#xff0c;从而简化了 API 的调用。 方法 list() 支持对一个列表提取某个字段&#xff…...

定制化服务发现:Eureka中服务实例偏好的高级配置

定制化服务发现&#xff1a;Eureka中服务实例偏好的高级配置 在微服务架构中&#xff0c;服务实例的智能管理和优化是保证系统高效运行的关键。Eureka作为Netflix开源的服务注册与发现框架&#xff0c;提供了丰富的配置选项来满足不同场景下的需求。服务实例偏好配置允许开发者…...

【实战场景】MongoDB迁移的那些事

【实战场景】MongoDB迁移的那些事 开篇词&#xff1a;干货篇【MongoDB迁移的方法】&#xff1a;1. 基于mongodump和mongorestore的迁移一、迁移前准备二、使用mongodump备份数据三、使用mongorestore还原数据四、注意事项 2. 基于MongoDB复制集的迁移一、迁移前准备二、配置新复…...

为什么要使用加密软件?

一、保护数据安全&#xff1a;加密软件通过复杂的加密算法对敏感数据进行加密处理&#xff0c;使得未经授权的人员即使获取了加密数据&#xff0c;也无法轻易解密和获取其中的内容。这极大地提高了数据在存储、传输和使用过程中的安全性。 二、遵守法律法规&#xff1a;在许多国…...

k8s学习笔记——dashboard安装

重装了k8s集群后&#xff0c;重新安装k8s的仪表板&#xff0c;发现与以前安装不一样的地方。主要是镜像下载的问题&#xff0c;由于网络安全以及国外网站封锁的原因&#xff0c;现在很多镜像按照官方提供的仓库地址都下拉不下来&#xff0c;导致安装失败。我查了好几天&#xf…...

AI艺术创作:掌握Midjourney和DALL-E的技巧与策略

AI艺术创作&#xff1a;掌握Midjourney和DALL-E的技巧与策略 AI艺术创作正逐渐成为艺术家和创意工作者们探索新表达方式的重要工具。Midjourney和DALL-E是两款领先的AI绘画工具&#xff0c;它们各有独特的功能和优势。本文将详细介绍如何掌握这两款工具的使用技巧&#xff0c;…...

在Mac上免费恢复误删除的Word文档

Microsoft Word for Mac是一个有用的文字处理应用程序&#xff0c;它与Microsoft Office套件捆绑在一起。该软件的稳定版本包括 Word 2019、2016、2011 等。 Word for Mac 与 Apple Pages 兼容;这允许在不同的操作系统版本中使用Word文档&#xff0c;而不会遇到任何麻烦。 与…...

HarmonyOS 屏幕适配设计

1. armonyOS 屏幕适配设计 1.1. 像素单位 &#xff08;1&#xff09;px (Pixels)   px代表屏幕上的像素点&#xff0c;是手机屏幕分辨率的单位&#xff0c;即屏幕物理像素单位。 &#xff08;2&#xff09;vp (Viewport Percentage)   vp是视口百分比单位&#xff0c;基于…...

Netfilter之连接跟踪(Connection Tracking)和反向 SNAT(Reverse SNAT)

连接跟踪&#xff08;Connection Tracking&#xff09; 连接跟踪是 Netfilter 框架中的一个功能&#xff0c;用于跟踪网络连接的状态和元数据。它使防火墙能够识别和处理数据包属于哪个连接&#xff0c;并在双向通信中正确匹配请求和响应数据包。 工作原理 建立连接&#xf…...

Linux下使用vs code离线安装各种插件

Linux下使用vs code离线安装各种插件 &#xff08;1&#xff09;手动下载插件 插件市场 -> 搜索插件名 -> 右边栏 Download Extension &#xff08;2&#xff09;寻找安装目录 whereis code一般会出现两个目录&#xff0c;选择右边那个/usr/share/code code: /usr/b…...

【常见开源库的二次开发】基于openssl的加密与解密——Base58比特币钱包地址——算法分析(三)

目录&#xff1a; 目录&#xff1a; 一、base58(58进制) 1.1 什么是base58&#xff1f; 1.2 辗转相除法 1.3 base58输出字节数&#xff1a; 二、源码分析&#xff1a; 2.1源代码&#xff1a; 2.2 算法思路介绍&#xff1a; 2.2.1 Base58编码过程&#xff1a; 2.1.2 Base58解码过…...

幻境·流金惊艳生成:从织梦令到流金光影汇聚的全过程效果对比

幻境流金惊艳生成&#xff1a;从织梦令到流金光影汇聚的全过程效果对比 1. 开篇&#xff1a;当技术遇见艺术的美妙邂逅 想象一下&#xff0c;你脑海中浮现出一个绝美的画面&#xff1a;赛博朋克都市中霓虹流淌的街道&#xff0c;或是水墨意境中的玄金山水。传统方式需要数小时…...

智能电池充电:使用PID控制器优化SOC附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

数理化随机出题系统HTML源码,适配教育场景,支持自定义题库与难度分级

&#x1f6e0;️ 系统核心功能多学科覆盖&#xff1a;支持数学、物理、化学三个学科的题目随机生成难度分级配置&#xff1a;可自定义简单、中等、困难三个难度级别的题目占比题库自定义&#xff1a;支持手动添加不同学科、不同难度的题目内容一键生成试卷&#xff1a;点击即可…...

AngularJS Http详解

AngularJS Http详解 引言 AngularJS是一个流行的JavaScript框架,用于构建动态和响应式的web应用。在AngularJS中,HTTP请求是数据交互的重要组成部分。本文将详细介绍AngularJS的Http服务,包括其基本用法、高级特性以及如何处理异步请求。 AngularJS Http服务简介 Angula…...

如何快速掌握DownKyi:从新手到专家的完整视频下载指南

如何快速掌握DownKyi&#xff1a;从新手到专家的完整视频下载指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#…...

电磁波衰减在气象雷达探测中的关键影响与优化策略

1. 电磁波衰减如何影响气象雷达的"视力" 想象一下你戴着沾满雨滴的眼镜看世界——视线模糊、细节丢失、距离判断失误。气象雷达遭遇电磁波衰减时&#xff0c;面临的正是类似的困境。当雷达发射的电磁波穿越雨雪云层时&#xff0c;能量就像被层层"抽成"&…...

ALOHA开源双臂机器人系统全攻略:从核心价值到深度实践

ALOHA开源双臂机器人系统全攻略&#xff1a;从核心价值到深度实践 【免费下载链接】aloha 项目地址: https://gitcode.com/gh_mirrors/al/aloha 一、探索ALOHA&#xff1a;重新定义低成本双手机器人开发 什么是ALOHA系统 ALOHA&#xff08;A Low-cost Open-source Ha…...

游戏化学习与编程实战:CodeCombat让编程学习像玩游戏一样简单

游戏化学习与编程实战&#xff1a;CodeCombat让编程学习像玩游戏一样简单 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 你是否也曾因枯燥的编程教程而中途放弃&#xff1f;是否希望找到一种既能…...

TVA在汽车零部件焊接点检测中的实操启示录(3)

TVA系统在汽车零部件焊接点检测的落地&#xff0c;并非简单的“设备安装调试”&#xff0c;而是一个涉及流程优化、人员适配、技术衔接的系统工程。不少企业技术主管因忽视落地全流程管控&#xff0c;出现“系统安装后无法正常运行”“员工不会操作”“检测流程与生产流程脱节”…...

即插即用模块-特征增强篇:FEM模块在遥感小目标检测中的实战解析

1. 遥感小目标检测的痛点与FEM模块的诞生 在遥感图像分析领域&#xff0c;小目标检测一直是个让人头疼的问题。想象一下&#xff0c;你要在卫星拍摄的城市图像中找到那些只有几十个像素大小的车辆&#xff0c;或者在广袤的农田中识别出微小的灌溉设备。这些目标不仅尺寸小&…...