Bendi新闻
>
SpringBoot+Redis+定时任务模拟手机短信验证
SpringBoot+Redis+定时任务模拟手机短信验证
25天前
👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:
Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本
说明
只是模拟给手机发送短信验证码,并且进行校验
真正能够给手机发送验证码短信还需要结合第三方,如阿里云、讯飞等
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
需求
发送手机号,返回验证码(6位随机数字)
每个手机号一天只能发送10次(为了测试方便,可以改成3次),每天0点重置次数 当天获取次数达到上限,提示“当天验证码获取次数已达上限,请明天再次使用” 每个验证码有效期为5分钟,获取验证码提示“【XX系统】您的手机验证码为:XXXXXX,有效期5分钟,此功能每天最多获取XX条,请勿向任何人出示,以免账号被盗” 5分钟内再次获取验证码提示“已有可用验证码,XX分XX秒内依然有效” 发送手机号和验证码,对手机号和验证码进行校验,返回验证结果
提示:“验证通过”或“验证失败,请确认手机号或验证码”
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
代码实现
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.Controller
@RestController
public class PhoneController {
@Resource
private PhoneService phoneService;
@RequestMapping("/send")
public String send(String phone) {
return phoneService.send(phone);
}
@RequestMapping("/check")
public String check(String phone,String code) {
return phoneService.check(phone,code);
}
}
3.service
3.1常量设定
private static final int MAX_TIME_OUT = 5;
private static final String MAX_PHONE_COUNT= "3";
private static final String PHONE_COUNT_SUFFIX=":COUNT";
private static final String PHONE_CODE_SUFFIX=":CODE";
3.2判断获取次数
if(RedisStringUtil.get(codeKey)==null &&
"3".equals(RedisStringUtil.get(countKey))){
return "当天验证码获取次数已达上限,请明天再次使用";
}
3.3判断验证码剩余时间
long exTime = RedisKeyUtil.getExpire(codeKey);
if(exTime>0){
return "已有可用验证码," + (exTime / 60) + "分 " + (exTime % 60) +
" 秒内依然有效";
}
3.4获取验证码
String.valueOf(new Random().nextInt(900000) + 100000);
3.5保存验证码,设置有效期,累加获取次数
String code = getCode();
RedisStringUtil.setEx(codeKey,code,MAX_TIME_OUT, TimeUnit.MINUTES);
RedisStringUtil.incrBy(countKey,1);
3.6校验手机号与验证码
String codeKey = phone + PHONE_CODE_SUFFIX;
if(code!=null && code.equals(RedisStringUtil.get(codeKey))){
return "验证成功";
}
return "验证失败,请确认手机号或验证码";
service层完整代码
@Service
public class PhoneService {
private static final int MAX_TIME_OUT = 5;
private static final String MAX_PHONE_COUNT= "3";
private static final String PHONE_COUNT_SUFFIX=":COUNT";
private static final String PHONE_CODE_SUFFIX=":CODE";
public String send(String phone) {
String countKey = phone + PHONE_COUNT_SUFFIX; //次数
String codeKey = phone + PHONE_CODE_SUFFIX; //验证码
if(RedisStringUtil.get(codeKey)==null &&
"3".equals(RedisStringUtil.get(countKey))){
return "当天验证码获取次数已达上限,请明天再次使用";
}
long exTime = RedisKeyUtil.getExpire(codeKey);
if(exTime>0){
return "已有可用验证码," + (exTime / 60) + "分 " + (exTime % 60) +
" 秒内依然有效";
}
String code = getCode();
RedisStringUtil.setEx(codeKey,code,MAX_TIME_OUT, TimeUnit.MINUTES);
RedisStringUtil.incrBy(countKey,1);
return "【地笼系统】您的手机验证码为:" + code
+ ",有效期5分钟,此功能每天最多获取" + MAX_PHONE_COUNT +
"条,请勿向任何人出示,以免账号被盗";
}
public String check(String phone, String code) {
String codeKey = phone + PHONE_CODE_SUFFIX;
if(code!=null && code.equals(RedisStringUtil.get(codeKey))){
return "验证成功";
}
return "验证失败,请确认手机号或验证码";
}
private String getCode(){
return String.valueOf(new Random().nextInt(900000) + 100000);
}
}
4.设置定时任务,每天0点清除所有短信获取次数
@Configuration
public class TaskConfig {
@Scheduled(cron = "10 18 * * * ?")
public void clearPhoneCount(){
System.out.println("-----------------");
RedisKeyUtil.delete(RedisKeyUtil.keys("*:COUNT"));
}
}
5.启动类上添加开启定时任务
@EnableScheduling
public class RedisdemoApplication {
public static void main(String[] args) {
SpringApplication.run(RedisdemoApplication.class, args);
}
}
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微信扫码关注该文公众号作者
来源:芋道源码
相关新闻
SpringBoot Redis 分布式锁的正确实现方式专家称高铁涨价是必要的,花钱可解锁特斯拉续航,索尼绑定PSN惹众怒,谷歌新验证系统不支持火狐,这就是今天的其他大新闻!我国重复使用运载火箭首次10公里级垂直起降飞行试验圆满成功;中国通号卡斯柯无人机AI巡检完成首飞场景验证丨智能制造日报SpringBoot + 事务钩子函数,打造高效支付系统!SpringBoot整合Canal+RabbitMQ监听数据变更~SpringBoot + 虚拟线程,鸟枪换大炮一张长图透彻理解 SpringBoot 启动原理,架构师必备知识,不为应付面试!热点|“在吗?可不可以帮我验证一下微信?”华人收到这条消息警惕!已有多人中招…“在吗?可不可以帮我验证一下微信?”华人收到这条消息警惕!已有多人中招…SpringBoot 动态加载 Jar 包,玩转动态配置!爱因斯坦又双叒对了,天文学家验证黑洞暴跌区 | 环球科学要闻国家药监局关于适用《Q2(R2):分析方法验证》《Q14:分析方法开发》国际人用药品注册技术协调会指导原则的公告利用 Java 反射机制提高 SpringBoot 的代码质量SpringBoot 实现 RAS+AES 自动接口解密Nat Med:司美格鲁肽长期减重效果被验证:体重腰围持续减少4年无反弹国自然热点追踪——衰老生物标志物的验证以及设计思路拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~SpringBoot 中实现订单30分钟自动取消的策略SpringBoot + Lua = 王炸!SpringBoot 容器镜像更新只要200k,你敢信???为什么建议你替换掉 SpringBoot 框架中的 Tomcat ?观点验证!节后跳水队涨不涨?如何通过内网穿透实现外部网络对 SpringBoot 接口的 HTTP 监听和调试?美国著名衰老研究所验证延寿化合物,重新「复活」6种潜在分子,发现具有性别特异性