【代码Demo】SpringBoot+Redis+定时任务模拟手机短信验证

目录

  • 说明
  • 需求
  • 代码实现
    • 1.依赖
    • 2.Controller
    • 3.service
      • 3.1常量设定
      • 3.2判断获取次数
      • 3.3判断验证码剩余时间
      • 3.4获取验证码
      • 3.5保存验证码,设置有效期,累加获取次数
      • 3.6校验手机号与验证码
      • service层完整代码
    • 4.设置定时任务,每天0点清除所有短信获取次数
    • 5.启动类上添加开启定时任务

说明

  1. 只是模拟给手机发送短信验证码,并且进行校验
  2. 真正能够给手机发送验证码短信还需要结合第三方,如阿里云、讯飞等

需求

  • 发送手机号,返回验证码(6位随机数字)
    • 每个手机号一天只能发送10次(为了测试方便,可以改成3次),每天0点重置次数
    • 当天获取次数达到上限,提示“当天验证码获取次数已达上限,请明天再次使用”
    • 每个验证码有效期为5分钟,获取验证码提示“【XX系统】您的手机验证码为:XXXXXX,有效期5分钟,此功能每天最多获取XX条,请勿向任何人出示,以免账号被盗”
    • 5分钟内再次获取验证码提示“已有可用验证码,XX分XX秒内依然有效”
  • 发送手机号和验证码,对手机号和验证码进行校验,返回验证结果
    • 提示:“验证通过”或“验证失败,请确认手机号或验证码”

代码实现

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 {@Resourceprivate 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);}
}

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

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

相关文章

档案数字化电子文件检测工具

在档案数字化的过程中&#xff0c;需要注意扫描的电子文件属性和质量是否符合要求。nhdeep电子文件属性检测工具&#xff0c;支持对图片、pdf和ofd文件&#xff0c;显示文件的基本属性&#xff1a;文件类型、文件大小、创建时间&#xff1b;采集文件的分辨率、图片颜色、图片的…

Agent AI智能体:我们的生活即将如何改变?

你有没有想过&#xff0c;那个帮你设置闹钟、提醒你朋友的生日&#xff0c;甚至帮你订外卖的智能助手&#xff0c;其实就是Agent AI智能体&#xff1f;它们已经在我们生活中扮演了越来越重要的角色。现在&#xff0c;让我们一起想象一下&#xff0c;随着这些AI智能体变得越来越…

基于STM32的智能垃圾桶设计(论文+源码)_kaic

基于STM32的智能垃圾桶设计 摘 要 随着社会科学技术的迅猛进展&#xff0c;人们的生活质量和速度也在不断提高。然而&#xff0c;大多数传统的家庭垃圾桶已经过时且缺乏创新&#xff0c;缺乏人性化设计。它们使用起来不方便、不卫生&#xff0c;所有的生活和废物垃圾都被混合…

【XR806开发板试用】阻塞式串口发送与接收教程

本文基于wsl2搭建的ubuntu18.04 vscode编辑器 很奇怪啊&#xff0c;找了半天居然没人发串口的教程&#xff0c;于是只能自己试一试了&#xff0c;在此发一个阻塞式的串口发送与接收的教程。并且&#xff0c;感谢.ACE彭洪权大佬在我配置环境遇到几十个报错的时候帮我远程搭建环…

Python中使用嵌套for循环读取csv文件出现问题

如果我们在使用嵌套循环来读取 CSV 文件时遇到了问题&#xff0c;可以提供一些代码示例和出现的具体错误&#xff0c;这样我可以更好地帮助大家解决问题。不过&#xff0c;现在我可以给大家一个基本的示例&#xff0c;演示如何使用嵌套循环来读取 CSV 文件。 问题背景 我需要读…

I forgot my Plex Account PIN; how can I reset it? How can I change my PIN?

If you’ve set a PIN on your Plex account, it’s possible to reset or remove that PIN. Related Page: Plex Home Regular Plex Account If you know the current PIN If the current PIN is known, then simply edit the current PIN on the Settings > Users &…

京牌小客车变更或转移登记办理指南!

京牌小客车的变更或转移登记&#xff0c;可以在北京市小客车指标调控管理信息系统中提交申请、审核。下面北京盛昂京牌小编沐沐整理的相关信息&#xff01; 办理方式&#xff1a; &#xff08;一&#xff09;交易过户方式&#xff1a;车辆登记所有人和受让方持审核通过的核查结…

torch教程

一 基本用法 1 torch.autograd.Function PyTorch 74.自定义操作torch.autograd.Function - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/344802526 虽然pytorch可以自动求导,但是有时候一些操作是不可导的,这时候你需要自定义求导方式。也就是所谓的 "Extending t…

怎样选择IT外包公司?需要注意什么?

随着网络化、数字化、智能化快速发展&#xff0c;一部分企业成立自己的IT部门&#xff0c;负责各个科室的网络安全&#xff0c;大部分企业把网络安全、数据安全&#xff0c;外包给专业的IT外包公司&#xff0c;既提升了办公效率&#xff0c;企业又能把主要精力放在发展核心业务…

BS-Diff | 扩散模型在骨抑制任务上的首次登场!

摘要 胸部 X 射线&#xff08;CXR&#xff09;是肺部筛查中常用的低剂量方式。然而&#xff0c;由于大约 75% 的肺部区域与骨骼重叠&#xff0c;这反过来又阻碍了疾病的检测和诊断&#xff0c;因此 CXR 的功效受到了一定程度的影响。作为一种补救措施&#xff0c;骨抑制技术已…

数组处理,去重合并相同key的值

背景&#xff1a; 上游返回的 skuIdList 存在相同的Id&#xff0c;skuCount数组与skuID一一对应 处理结果&#xff1a;skuIdList 去重&#xff0c;对应的count总和要加起来&#xff0c;对应的 originalPriceList 和 subtotalPriceList 不变 代码&#xff1a; import groovy.…

算法提高之能量项链

算法提高之能量项链 核心思想&#xff1a;区间dp 通过观察发现可以将n个珠子最后的n1个数看作石子 合并石子 在l~r的范围内 找k作隔断 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,M N<<…

libcity笔记:libcity/evaluator/traj_loc_pred_evaluator.py

1 构造函数 2 _check_config 检查配置是否符合评估器的要求&#xff0c;确保评估过程能够顺利执行 3 collect 4 evaluate 5 save_result & clear

【自动驾驶|毫米波雷达】逻辑化讲解测角全流程

第一次更新&#xff1a;2024/5/7 目录 一. 引入 基础概念 二. 测角原理 1. 接收天线不同位置 2. 角度几何关系 3. 角度正负规定 4. 角度测量 5. 最大不模糊角 三. 角度分辨率 1. 相位变化量 2. 角度表示 3. 角度变化量 三. 测角算法 1. 三维快速傅里叶变换 (3D-FFT&…

代码随想录算法训练营第二十天:二叉树成长

代码随想录算法训练营第二十天&#xff1a;二叉树成长 110.平衡二叉树 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝…

用c语言进行栈的实现

一、栈的概念 栈Stack&#xff1a; 是只允许在一端进行插入或删除的性表线。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作&#xff08;类似于一个只有开口的瓶子&#xff09;。&#xff08;遵循LIFO原则&#xff09;——后进先出&#xff08…

音视频知识基础篇----媒体格式

1. 流媒体&#xff08;Streaming media&#xff09; 流媒体&#xff1a;一连串的多媒体资料压缩后&#xff0c;经过互联网分段发送资料&#xff0c;在互联网上即时传输影音以供观赏的一种技术与过程&#xff0c;此技术使得资料数据包得以像流水一样发送&#xff0c;如果不使用此…

想让网站实现HTTPS访问?教你十分钟内实现

实现网站HTTPS访问通常遵循以下简明步骤&#xff1a; 1. 选择并申请SSL证书&#xff1a; - 根据网站需求&#xff0c;挑选合适的SSL证书类型。常见的有&#xff1a; - DV&#xff08;域名验证&#xff09;&#xff1a;适用于个人或小网站&#xff0c;仅验证域名所有权。 - OV&a…

获取火力发电乙级资质步骤与条件汇总

步骤概览&#xff1a; 工商注册&#xff1a;首先&#xff0c;企业需要在工商部门完成注册&#xff0c;确保公司合法成立&#xff0c;经营范围包含电力工程设计等相关内容。 配置专业人员&#xff1a;根据资质要求&#xff0c;企业需配备一定数量和专业的技术人员&#xff0c;包…

JVM进程缓存 Caffeine

JVM进程缓存 Caffeine 初识Caffeine Caffeine是一个基于Java8开发的&#xff0c;提供了近乎最佳命中率的高性能的本地缓存库。 ben-manes/caffeine: A high performance caching library for Java (github.com) 实例代码 Test void testBasicOps() {// 创建缓存对象Cache&…