短信验证码发送实现(详细教程)

短信验证码

  • 接口防刷
  • 强检验以及缓存验证码
  • 阿里云短信服务操作步骤
  • 验证码发送实现

好久没发文啦!最近也是在工作中遇到我自认为需要记录笔记的需求,本人只求日后回顾有迹可寻,不喜勿喷!
废话不多说,直接上代码!

@ResponseBody@GetMapping("/sms/sendcode")public R sendCode(@RequestParam("phone") String phone) {//从Redis中获取要发送验证码的手机号对应的valueString redisCode = redisTemplate.opsForValue().get(AuthConstants.SMS_CODE_CACHE_PREFIX + phone);if (!StringUtils.isEmpty(redisCode)) {//redisCode不为空,说明redis中是有该手机号的code缓存的//这个分隔是保存code码的格式(保存格式在下面的代码片段)long l = Long.parseLong(redisCode.split("_")[1]);if (System.currentTimeMillis() - l < 60000) {//如果当前时间与code缓存的时间差小于1分钟的话,是不允许再次发送验证码的return R.error(BizCode.SMS_CODE_EXCRPTION.getCode(), BizCode.SMS_CODE_EXCRPTION.getMsg());}}//redisCode不为空,该手机号是第一次调验证码发送接口//强检验验证码String code = UUID.randomUUID().toString().substring(0, 5);String s = code + "_" + System.currentTimeMillis();//缓存验证码redisTemplate.opsForValue().set(AuthConstants.SMS_CODE_CACHE_PREFIX + phone, s, 5, TimeUnit.MINUTES);//远程调用发送验证码服务log.info("------开始发送验证码------");R r = thirdPartyFeignService.sendCode(phone, code);if (r.getCode() == 200) {log.info("-----发送验证码成功------");}return R.ok();}

接口防刷

短信验证码一般做出来就是要加入防刷逻辑的,防止有些不怀好意的人对接口进行恶意调用,导致系统崩溃,对系统的性能和CPU负载都会有一定影响的,可能会导致之后页面请求后端数据时卡顿或者相应速度会很慢,影响用户的体验感。那接口防刷怎么做呢?我刚接触的时候觉得很复杂,熟悉之后发现逻辑上还是很简单的(校验位需要多种方式结合,用Redis存储)。

看出来了吧?实际上就是加了个时间的校验,这也是最简单的一种防刷方案。

强检验以及缓存验证码

利用UUID的随机性,再截取其中几位,通过“_”和系统时间进行拼接成redis中的value,缓存时间为5分钟,也就是该验证码5分钟内有效。

阿里云短信服务操作步骤

1、进入阿里云官网,短信服务位置如图下所示:

在这里插入图片描述

2、根据自己的需求选择想要的API(友情提示一下,都有5次免费试用的),后续操作步骤是一样的

在这里插入图片描述

3、购买后点击商品服务

在这里插入图片描述

4、这里可以根据自己的信息进行调试

在这里插入图片描述

5、直接CV API请求示例到你的代码中

验证码发送实现

集成阿里云的短信验证码发送API模板,可以去阿里云官网的短信服务文档看看,还是很好理解的。

@ConfigurationProperties(prefix = "spring.cloud.alicloud.sms")
@Data
@Component
public class SmsComponent {private String host;private String path;private String mobile;private String appcode;public void sendCode(String phone,String code) {String method = "GET";Map<String, String> headers = new HashMap<String, String>();//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105headers.put("Authorization", "APPCODE " + appcode);Map<String, String> querys = new HashMap<String, String>();querys.put("mobile", phone);querys.put("content", "【智能云】您的验证码是"+code+"。如非本人操作,请忽略本短信");//JDK 1.8示例代码请在这里下载:  http://code.fegine.com/Tools.ziptry {HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);//System.out.println(response.toString());如不输出json, 请打开这行代码,打印调试头部状态码。//状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误//获取response的bodySystem.out.println(EntityUtils.toString(response.getEntity()));} catch (Exception e) {e.printStackTrace();}}}

@ConfigurationProperties(prefix = “spring.cloud.alicloud.sms”)

@ConfigurationProperties是Spring Boot提供的一个注解,用于将外部配置属性绑定到Java对象上。通过使用这个注解,开发者可以将配置文件(如application.properties或application.yml)中的属性值自动映射到Java类的字段上,从而实现配置的集中管理和类型安全。

spring:cloud:alicloud:sms:host: 申请的短信host地址path: 阿里云短信验证码的接口路径appcode: 你的APPCODE

以上配置对应的就是那几个变量值。

@ConfigurationProperties的作用

  • 配置绑定:将配置文件中的属性值绑定到Java类的字段上,实现配置的自动映射。
  • 类型安全:提供类型安全的配置绑定,避免类型转换错误。
  • 复杂配置:支持复杂配置结构的绑定,如嵌套对象、集合、Map等。
  • 配置校验:结合@Valid注解,实现配置属性的校验。

然后Postman完成自测,你会发现短信验证码的功能就实现啦!(阿里云短信服务可能需要付一点点的费用哦!)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习数学基础之梯度

深度学习数学基础之梯度 方向余弦 方向导数 梯度&#xff08;向量&#xff09; 变化率最大的方向或者说方向导数最大的方向就是梯度向量的方向指向方向导数变化最大的方向

PYNQ 框架 - VDMA驱动 - 帧缓存

目录 1. 简介 2. 代码分析 2.1 _FrameCache 类定义 2.1.1 xlnk.cma_array() 2.1.2 pointerNone 2.1.3 PynqBuffer 2.2 _FrameCache 例化与调用 2.3 _FrameCache 测试 2.4 _FrameList 类定义 2.5 _FrameList 例化与调用 2.6 _FrameList 测试 3. 帧的使用 3.1 读取帧…

Cloud Compare学习笔记

1.1 导出文件 导出点云数据为 PCD 格式时&#xff0c;系统提供了三种保存选项&#xff0c;分别是 Compressed Binary&#xff08;压缩二进制&#xff09;、Binary&#xff08;二进制&#xff09;、ASCII/Text&#xff08;文本&#xff09; Compressed Binary&#xff08;压缩…

电商直播带货乱象频出,食品经销商如何规避高额损失?

近年来&#xff0c;电商直播带货乱象频出&#xff0c;食品经销行业售卖商品涉嫌违规的事件层出不穷。以食品安全为例&#xff0c;2024年10月17日市场监管总局发布了关于11批次食品抽检不合格情况的通告&#xff0c;在抽检的650批次样品中&#xff0c;发现存在食品添加剂超范围超…

攻防世界 MISC miao~详解

下载压缩包&#xff0c;但是尝试解压的时候提示错误&#xff0c;刚开始以为是伪加密之类的&#xff0c;但是尝试了一圈之后&#xff0c;发现并没有问题。后面用bandizip打开&#xff0c;得到了一张图片&#xff1a; 拖到010editor里面查看&#xff0c;没有发现什么 于是用随波逐…

基于Unet卷积神经网络的脑肿瘤MRI分割

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【YOLO模型实现农作物病虫害虫识别带GUI界面】 2.【卫星图像道路检测DeepLabV3P…

记一次:使用使用Dbeaver连接Clickhouse

前言&#xff1a;使用了navicat连接了clickhouse我感觉不太好用&#xff0c;就整理了一下dbeaver连接 0、使用Navicat连接clickhouse 测试连接 但是不能双击打开&#xff0c;可是使用命令页界面&#xff0c;右键命令页界面&#xff0c;然后可以用sql去测试 但是不太好用&#…

python nan是什么

NaN&#xff08;not a number&#xff09;&#xff0c;在数学表示上表示一个无法表示的数&#xff0c;这里一般还会有另一个表述inf&#xff0c;inf和nan的不同在于&#xff0c;inf是一个超过浮点表示范围的浮点数&#xff08;其本质仍然是一个数&#xff0c;只是他无穷大&…

ABAP开发学习——内存管理二

SAP内存与ABAP内存的不同 SAP内存 当在某个事务程序中输入了物料号等&#xff0c;在打开其他需要输入物料号的事务窗口中会自动带出&#xff0c;不需要自己输入&#xff0c;因为这些地方使用相同的parameter id&#xff0c;共享相同SAP内存区域 在数据库表TPARA中可以查看到 S…

如何在短时间内入门并掌握深度学习?

如何在短时间内快速入门并掌握深度学习&#xff0c;是很多读者的困惑——晦涩难懂的数学 知识、复杂的算法、烦琐的编程……深度学习虽然让无数读者心怀向往&#xff0c;却也让不少人望而生畏&#xff0c;深感沮丧&#xff1a;时间没少花&#xff0c;却收效甚微。 如何才能更好…

ubuntu交叉编译zlib库给arm平台使用

1.下载并解压: 2.生成makefile 3.修改makefile 4.编译: make 出现下面错误先安装 gcc-arm-linux-gnueabihf 安装 gcc-arm-linux-gnueabihf

MySQL数据类型——针对实习面试

目录 MySQL字段类型分类char和varchar的区别null和“ ”的区别datetime和timestamp的区别为什么在MySQL中不推荐使用text或blob类型MySQL中如何表示布尔类型在设计数据库中&#xff0c;如何优化性能&#xff08;一般不会问那么深&#xff0c;了解就行&#xff09; MySQL字段类型…

【有啥问啥】视频插帧算法技术原理详解

视频插帧算法技术原理详解 引言 视频插帧&#xff08;Video Interpolation&#xff09;技术&#xff0c;作为计算机视觉领域的一项重要应用&#xff0c;旨在通过算法手段在已有的视频帧之间插入额外的帧&#xff0c;从而提升视频的帧率&#xff0c;使其看起来更加流畅。这一技…

我在命令行下学日语

同一个动作重复 300 遍&#xff0c;肌肉就会有记忆&#xff0c;重复 600 遍&#xff0c;脊柱就会有记忆&#xff0c;学完五十音图不熟练&#xff0c;经常遗忘或者要好几秒才想得起来一个怎么办&#xff1f;没关系&#xff0c;我做了个命令行下的小游戏 KanaQuiz 来帮助你记忆&a…

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…

【C++滑动窗口】2653. 滑动子数组的美丽值|1785

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 C堆(优先队列) LeetCode2653. 滑动子数组的美丽值 给你一个长度为 n 的整数数组 nums &#xff0c;请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为&#xff1a;如果子数组中第 x 小整数…

HarmonyOS NEXT: 抓住机遇,博

鸿蒙生态崛起&#xff1a;开发者如何抓住机遇&#xff0c;创造卓越应用体验 鸿蒙系统的崛起与优势开发者面临的机遇与挑战解决方案与前景分析开发人员学习路径 在移动操作系统领域&#xff0c;安卓&#xff08;Android&#xff09;和苹果iOS系统长期占据主导地位。然而&#xf…

django5入门【04】Django框架配置文件说明:settings.py

文章目录 1. 基础路径配置2. 启动模式配置3. 站点访问权限配置4. App配置5. 中间件配置6. 模板配置7. 数据库配置8. 路由配置9. 语言与时区配置10. 静态文件配置11. 总结 1. 基础路径配置 在settings.py文件中&#xff0c;通过BASE_DIR配置项来绑定项目的绝对路径。这个路径是…

ZeroNL2SQL:零样本 NL2SQL

发布于&#xff1a;2024 年 10 月 30 日 星期三 #RAG #NL2SQL # Zero-Shot 自然语言到 SQL&#xff08;NL2SQL&#xff09;的转换是一个重要的研究领域&#xff0c;它允许非技术用户轻松访问和分析数据&#xff0c;在商业智能、数据分析等领域具有广泛的应用前景。然而&#x…

nginx配置https及url重写

nginx配置https及url重写 一、https简介1、安全访问2、数据的安全性3、数据的完整性3、身份的真实性 二、配置https网站1、环境规划2、部署私有CA3、部署https的虚拟主机 三、URL重写1、语法 四、location的写法1、语法2、location uri {}3、location ~ uri { }4、location ~*…