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

embedded/2024/10/30 23:38:04/

短信验证码

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

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

java">@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模板,可以去阿里云官网的短信服务文档看看,还是很好理解的。

java">@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.ppmy.cn/embedded/133740.html

相关文章

数据库存储过程的后端调用(SQLServer)

项目中使用到了SQL Server的存储过程&#xff0c;其位于可编程性-存储过程&#xff0c;详细如下。 其内需要四个入参&#xff0c;为表名&#xff0c;列名&#xff0c;左固定值&#xff0c;剩下右边的长度。 本项目中需要生成10位验收单编号&#xff0c;其中前六位为年月&#…

C#从零开始学习(用户界面)(unity Lab4)

这是书本中第四个unity Lab 在这次实验中,将学习如何搭建一个开始界面 分数系统 点击球,会增加分数 public void ClickOnBall(){Score;}在OneBallBehaviour类添加下列方法 void OnMouseDown(){GameController controller Camera.main.GetComponent<GameController>();…

从零开始使用Surya-OCR最新版本0.6.1——最强文本检测模型:新添表单表格检测识别

目录 一、更新概述 二、环境安装 1.基础环境配置 2.模型参数下载 3.参数地址配置——settings.py 三、指令使用 1.命令指令运行 一、更新概述 surya项目Github地址&#xff1a;https://github.com/VikParuchuri/surya 号称今年最强OCR的surya近期迎来新的更新&#xff0c;Vik…

物联网网关确保设备安全

物联网&#xff08;IoT&#xff09;网关在确保设备安全方面扮演着至关重要的角色。 作为连接物联网设备和云端或企业系统的中介&#xff0c;物联网网关可以实施多种安全措施来保护设备和数据。 是物联网网关确保设备安全的关键方法&#xff1a; 1. 设备认证和授权 认证&…

六,Linux基础环境搭建(CentOS7)- 安装HBase

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装HBase 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、HBase下载及安装 HBase是一个分布式的、面向列的开源数据库&#xff0c;该技术来源于 Fay Chang 所撰写的Google论文…

Qt之hello world

目录 图形化的方式 使用QLabel 使用编辑框 使用按钮 纯代码的方式 使用QLabel 使用编辑框 使用按钮 关于对象树 观察现象 Qt的常用知识 快捷键 使用帮助文档 Qt 窗口体系 我们最开始学习语言时&#xff0c;第一个接触的知识就是输出字符串 "hello world&quo…

如何使用Git

简介 一.git简介 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理.通过Git仓库来存储和管理这些文件,Git仓库分两种: 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 commit:提交,将本地文件和版本信息保存到本地仓库 p…

AD画的原理图如何导出PDF

说明 画好原理图后有时需要将原理图的PDF图导出来&#xff0c;以方便汇报或者问题查找。导出方法如下所示&#xff1a; 导出方法 PDF图导出完毕&#xff01;