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

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

短信验证码

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

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

废话不多说,直接上代码!

@ResponseBody

@GetMapping("/sms/sendcode")

public R sendCode(@RequestParam("phone") String phone) {

//从Redis中获取要发送验证码的手机号对应的value

String 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 headers = new HashMap();

//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105

headers.put("Authorization", "APPCODE " + appcode);

Map querys = new HashMap();

querys.put("mobile", phone);

querys.put("content", "【智能云】您的验证码是"+code+"。如非本人操作,请忽略本短信");

//JDK 1.8示例代码请在这里下载: http://code.fegine.com/Tools.zip

try {

HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);

//System.out.println(response.toString());如不输出json, 请打开这行代码,打印调试头部状态码。

//状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误

//获取response的body

System.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完成自测,你会发现短信验证码的功能就实现啦!(阿里云短信服务可能需要付一点点的费用哦!)

相关文章

怎么进入pe系统 如果电脑进PE特别慢,最好耐心等待10分钟以上,再下结论
八道精致位上菜,瞬间提高餐厅档次!
365bet网址多少

八道精致位上菜,瞬间提高餐厅档次!

⌛ 06-30 👁️‍🗨️ 9680
弦的成语
365bet官网网址多少

弦的成语

⌛ 07-07 👁️‍🗨️ 2657
山童哪里多
365bet官网网址多少

山童哪里多

⌛ 07-24 👁️‍🗨️ 8460
三天两觉小说作品集 三天两觉作品哪本好看 三天两觉写的书
神器365软件下载

三天两觉小说作品集 三天两觉作品哪本好看 三天两觉写的书

⌛ 07-09 👁️‍🗨️ 8053
郑州3d动画公司排名
神器365软件下载

郑州3d动画公司排名

⌛ 07-31 👁️‍🗨️ 1794