SpringBoot+Redis发送短信

SpringBoot+Redis发送短信

pom.xml

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

application.xml

spring:data:redis:host: 192.168.226.134password: 123456

实体类

package com.sin.pojo;/*** @createTime 2024/6/5 9:48* @createAuthor SIN* @use 验证码信息*/
public class VerificationCode {private String phoneNumber;private String code;// setter getter方法
}

RandomCodeUtil.java

package com.sin.utils;import org.springframework.stereotype.Component;import java.util.Random;/*** @createTime 2024/6/5 9:50* @createAuthor SIN* @use*/
@Component
public class RandomCodeUtil {// 生成6位随机数字验证码public static String generateRandomCode() {Random random = new Random();int code = 100000 + random.nextInt(900000);return String.valueOf(code);}
}

VerifcationCodeService.java

package com.sin.service;import java.time.Duration;/*** @createTime 2024/6/5 9:52* @createAuthor SIN* @use*/
public interface VerifcationCodeService {// 保存验证码到 Redis 并设置过期时间为60秒public String saveVerificationCode(String phoneNumber) ;// 检查验证码是否正确public boolean checkVerificationCode(String phoneNumber, String code) ;
}

VerifcationCodeServiceImpl.java

package com.sin.service.impl;import com.sin.service.VerifcationCodeService;
import com.sin.utils.RandomCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.TimeoutUtils;
import org.springframework.stereotype.Service;import java.time.Duration;/*** @createTime 2024/6/5 9:52* @createAuthor SIN* @use*/
@Service
public class VerifcationCodeServiceImpl  implements VerifcationCodeService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RandomCodeUtil randomCodeUtil;@Overridepublic String saveVerificationCode(String phoneNumber) {String codeInRedis = stringRedisTemplate.opsForValue().get(phoneNumber);if (codeInRedis == null) {String code = randomCodeUtil.generateRandomCode();stringRedisTemplate.opsForValue().set(phoneNumber, code, Duration.ofSeconds(60));long currentTimeMillis = System.currentTimeMillis();stringRedisTemplate.opsForValue().set(phoneNumber + "_sentTime", String.valueOf(currentTimeMillis)); // 记录发送时间return "验证码已发送至手机";} else {// 如果已经发送过验证码,则计算距离下次发送的时间间隔long timeLeft = getTimeLeft(phoneNumber);return "信息已发送,请等待 " + timeLeft + " 秒后重试";}}// 计算距离下次发送的时间间隔private long getTimeLeft(String phoneNumber) {String lastSentTimeStr = stringRedisTemplate.opsForValue().get(phoneNumber + "_sentTime");if (lastSentTimeStr != null) {long lastSentTime = Long.parseLong(lastSentTimeStr);long currentTime = System.currentTimeMillis();long elapsedTime = currentTime - lastSentTime;long timeLeft = 60 - elapsedTime / 1000; // 时间间隔以秒为单位return Math.max(timeLeft, 0); // 如果时间间隔小于0,则返回0} else {return 0; // 如果没有记录发送时间,则可以立即重试}}@Overridepublic boolean checkVerificationCode(String phoneNumber, String code) {String savedCode = stringRedisTemplate.opsForValue().get(phoneNumber);return code.equals(savedCode);}
}

VerificationCodeController.java

package com.sin.controller;import com.sin.service.VerifcationCodeService;
import com.sin.utils.RandomCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class VerificationCodeController {@Autowiredprivate VerifcationCodeService verificationCodeService;// 发送验证码的接口@PostMapping("/sendVerificationCode")public String sendVerificationCode(@RequestParam String phoneNumber) {return  verificationCodeService.saveVerificationCode(phoneNumber);}// 验证验证码的接口@PostMapping("/verifyCode")public String verifyCode(@RequestParam String phoneNumber, @RequestParam String code) {if (verificationCodeService.checkVerificationCode(phoneNumber, code)) {return "验证通过";} else {return "验证失败";}}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Python | Leetcode Python题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:start, cur_res, total_res 0, 0, 0for i in range(len(gas)):cur_res gas[i] - cost[i]total_res gas[i] - cost[i]if cur_res < 0:cur_r…

python使用opencv实现火焰检测

火焰检测是计算机视觉领域的一个重要应用&#xff0c;它可以帮助人们及时发现火灾隐患&#xff0c;保障人民生命财产安全。本文将介绍如何使用Python实现火焰检测&#xff0c;主要分为以下几个步骤&#xff1a; 安装所需库读取视频文件对每一帧图像进行处理检测火焰显示结果 …

Java EE-Spring Security配置

Spring Security 基本概念 spring security 的核心功能主要包括&#xff1a; 认证 &#xff08;你是谁&#xff09; 授权 &#xff08;你能干什么&#xff09; 攻击防护 &#xff08;防止伪造身份&#xff09; 其核心就是一组过滤器链&#xff0c;项目启动后将会自动配置。…

可视化数据科学平台在信贷领域应用系列四:决策树策略挖掘

信贷行业的风控策略挖掘是一个综合过程&#xff0c;需要综合考虑风控规则分析结果、效果评估、线上实时监测和业务管理需求等多个方面&#xff0c;以发现和制定有效的信贷风险管理策略。这些策略可能涉及贷款审批标准的调整、贷款利率的制定、贷款额度的设定等&#xff0c;在贷…

在使用高防IP的时候易出现什么问题,该如何解决呢?

一、常见问题 1.回源IP被拦截或限速&#xff1a;高防IP服务在中间代理&#xff0c;隐藏了源站服务器的真实IP。当源站服务器配置有DDoS攻击等相关安全防护策略时&#xff0c;可能会误将高防IP的回源IP识别为恶意攻击&#xff0c;导致限速甚至拦截。 2.网站接入高防IP后出现502…

UE5_加载本地图片(jpg, png) 转 UTexture

UE5_加载图片到UTexture __Desc使用方式源码 __Desc __Time__: 2024-06-05 16:30 __Author__: Yblackd __Desc__: UE5.2 加载本地图片 转 UTexture2D, 给材质 和 UMG 使用使用方式 新建继承BlueprintFunctionLibrary c 类复制下面源码&#xff0c;修改类名实测加载 jpg,jpeg,…

c++简略实现共享智能指针Shared_Ptr<T>

重点&#xff1a; 1.引用计数在堆上&#xff08;原本应为原子变量&#xff09; 2.引用计数增加减少需要加锁保证线程安全。 3.内部实现Release函数用于释放资源 4.未实现&#xff0c;增加自定义删除器可以将Release修改为模板函数&#xff0c;传入可调用参数。对于shared_p…

java分布式的ACP是什么

ACP 1、ACP是什么 一致性&#xff08;Consistency&#xff09;&#xff1a;在分布式系统中&#xff0c;当更新操作完成之后&#xff0c;所有节点在同一时间看到的数据是一致的。换句话说&#xff0c;对于任何数据的读取&#xff0c;都会得到最后写入的数据。可用性&#xff0…

Python键盘设置:深度探索与个性化定制

Python键盘设置&#xff1a;深度探索与个性化定制 在Python编程的世界中&#xff0c;键盘设置往往被忽视&#xff0c;但它实际上是一个能够极大提升编程效率和舒适度的关键因素。本文将深入探索Python键盘设置的四个方面、五个方面、六个方面和七个方面&#xff0c;带你走进一…

工商注册代理记账——打造专业服务的专业机构

在当今竞争激烈的商业环境中&#xff0c;注册和运营一家公司成为了每一个企业家的重要步骤&#xff0c;这并不是一件容易的事&#xff0c;涉及到的不仅是法律法规的学习&#xff0c;还有各种手续的办理、税务筹划等问题&#xff0c;这个时候&#xff0c;就需要专业的工商注册代…

Flask 学习笔记 总结

python基础 服务端开发编程 第一个是赋值运算&#xff0c;第二是乘法&#xff0c;最后是一个是幂&#xff08;即a2&#xff09; a 2 a * 2 a ** 2 Python支持多重赋值&#xff1a; a, b, c 2, 3, 4 这句命令相当于&#xff1a; a 2 b 3 c 4 Python支持对字符串的灵活…

redis常用设计模式

Redis常用的设计模式分为读&#xff0c;写&#xff0c;读写三种 一、概要说明 读操作 Read Through Pattern 读穿透 写操作 以Redis统一视图为准&#xff1a;先更新缓存&#xff0c;后更新数据库。 Write Through Pattern 直写模式&#xff08;首先将数据写入缓存&#xf…

连接ssl加密的kafka集群

1 kafka传输层(TLS)加密 传输层加密用于保护在Kafka集群内以及Kafka客户端与服务器之间传输的数据。Kafka通过SSL/TLS&#xff08;安全套接层/传输层安全&#xff09;协议来实现传输层加密。 2 获取client证书 这里我们的kafka集群已经加密&#xff0c;所以我们直接获取用于…

51建模网3D编辑器:一键为3D模型设置特殊材质

3D设计师要对3D模型设置玻璃或者钻石材质时&#xff0c;操作比较复杂&#xff0c;但是利用51建模网的3D编辑器&#xff0c;不用下载安装软件&#xff0c;在线通过浏览器即可编辑&#xff0c;具有一键设置特殊材质的功能。目前&#xff0c;它支持钻石材质、玻璃材质和水波纹材质…

Java——基础快速过

1.注释&#xff0c;标识符&#xff0c;关键字 1.1注释 单行注释&#xff1a;// 注释内容&#xff08;用的最多&#xff09; 多行注释&#xff1a;/* 注释内容*/&#xff08;不推荐&#xff09; 文档注释&#xff1a; /** 文档注释 */&#xff08;常见于方法和类之上描述方法和…

Linux操作系统:在虚拟环境下zookeeper的安装与部署

将 Zookeeper 安装到指定目录 // 将zookeeper解压到安装目录 $ tar –zxvf zookeeper-3.4.10.tar.gz –C /usr/local $ mv /usr/local/zookeeper-3.4.10.tar.gz /usr/local/zookeeper 设置 zookeeper 配置文件 // 创建 data 数据目录 $ mkdir /usr/local/zookeeper/data // …

分布式任务队列系统 celery 进阶

通过前面的入门&#xff0c;我们大概了解了celery的工作原理及简单的入门代码示例&#xff08;传送门&#xff09;&#xff0c;下面进行一些稍微复杂的任务调度学习 多目录结构异步执行 在实际项目中&#xff0c;使用Celery进行异步任务处理时&#xff0c;经常需要将代码组织…

【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)

阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官&#xff1a;C多线程了解吗&#xff1f;你给我写一下&#xff0c;起两个线程交替打印0~100的奇偶数。就是有两个线程&#xff0c;一个线程打印奇数另一个打印偶数&#xff0c;它们交替输出&…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

根据word模板生成word内容(JAVA)

主要是借助 poi-tl 来实现业务需求 当时第一次尝试的是Apache poi不是很好用&#xff0c;不推荐 第二次是xml&#xff0c;找的眼睛都花了&#xff0c;不推荐 要求&#xff1a;jdk1.8&#xff0c;Apache POI5.2.2 我这里使用的是5.2.3版本 文档&#xff1a;Poi-tl Documentati…