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

news/2024/10/29 0:42:48/

短信验证码

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

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

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/news/1542730.html

相关文章

Linux定时器定时任务清理log日志文件

首先&#xff0c;创建xx.sh文件&#xff0c;内容如下 #!/bin/bash sfecho "" > /var/lib/docker/containers/12379e809ea1294eea9b117368181cff1dd3915fdb1611f940c5cf3d6077d734/12379e809ea1294eea9b117368181cff1dd3915fdb1611f940c5cf3d6077d734-json.log 打…

数字IC后端实现Innovus |给各种IP子模块添加port buffer和antenna diode万能脚本

我们之前分享过在hierarchical flow后端实现中为了确保顶层flatten时timing signoff和physical signoff看到的情况和模块级看到的情况一致&#xff0c;我们会在模块io port添加io port buffer&#xff08;主要是timing&#xff0c;antenna一致性&#xff09;。实际上在芯片级我…

04C++循环结构

//while 循环#include <iostream> using namespace std; int main() { int num0; while (num<10){ cout<<num<<endl; num; } return 0; } //do while语句 #include <iostream> using namespace std; int mai…

【vue】Mammoth.js的使用:将.docx和doc 文件转换成HTML

mammoth.convertToHtml(input, options&#xff09; &#xff1a;把源文档转换为 HTML 文档 mammoth.convertToMarkdown(input, options) &#xff1a;把源文档转换为 Markdown 文档。 mammoth.extractRawText(input) &#xff1a;提取文档的原始文本。这将忽略文档中的所有格式…

格姗知识圈博客网站开源了!

格姗知识圈博客 一个基于 Spring Boot、Spring Security、Vue3、Element Plus 的前后端分离的博客网站&#xff01;本项目基本上是小格子一个人开发&#xff0c;由于工作和个人能力原因&#xff0c;部分技术都是边学习边开发&#xff0c;特别是前端&#xff08;工作中是后端开…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

自定义鼠标事件在拖拽中的使用

目标&#xff1a; 显示鼠标在容器元素中划过时经过的元素,但是容器内肯能会出现大量元素&#xff0c;所以直接给容器元素添加click事件&#xff0c;通过elementFromPoint的API模拟子元素被点击事件效果 看看效果吧 涉及的重要对象 MousEvent 参考 MDN 相关代码 operateCont…

网站建设中需要注意哪些安全问题?----雷池社区版

服务器与应用安全指南 1. 服务器安全 1.1 操作系统安全 及时更新补丁&#xff1a;确保操作系统始终安装最新补丁&#xff0c;以防范系统漏洞。例如&#xff0c;Windows Server 定期推送安全更新&#xff0c;修复如远程代码执行等潜在威胁。优化系统服务配置&#xff1a;关闭不…