用Redis实现获取验证码,外加安全策略

2024-04-26 10:20

本文主要是介绍用Redis实现获取验证码,外加安全策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安全策略

一小时内只能获取三次,一天内只能获取五次

Redis存储结构

在这里插入图片描述

代码展示

import cn.hutool.core.util.RandomUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.Map;@SpringBootTest
public class Test01 {@Resourceprivate StringRedisTemplate stringRedisTemplate;private static final Logger logger = LogManager.getLogger(Test01.class);//redis前缀final String k = "YZM:COUNT:123456";//过期时间final Long EXPIRETIME = 1L;//一小时生成的次数final String HOURCOUNT = "hourCount";//24时生成的次数final String DAYCOUNT = "hourCount";//yzmfinal String YZM = "yzm";//校验一小时内的时间final String TIME = "time";//往Redis中存值public  void setYzm(DateTimeFormatter format,Integer hourCountStart,Integer dayCountStart,Boolean sign){logger.info("setYzm |start |往Redis中存值");//验证码的生成时间LocalDateTime now = LocalDateTime.now();//LocalDateTime转StringString date = format.format(now);String yzm = RandomUtil.randomNumbers(6);//发送验证码logger.info("setYzm |····· |验证码:{}",yzm);//准备存储数据HashMap<String, String> yzmInfo = new HashMap<>();if (true==sign){yzmInfo.put("time",date);   //验证码生成时间logger.info("setYzm |····· |生成校验时间:{}",date);}yzmInfo.put("hourCount",hourCountStart.toString()); //一小时生成的次数yzmInfo.put("dayCount",dayCountStart.toString()); //24h生成的次数yzmInfo.put("yzm",yzm); //验证码//以hash的结果存入Redis中stringRedisTemplate.opsForHash().putAll(k,yzmInfo);Boolean expire = stringRedisTemplate.expire(k, Duration.ofDays(EXPIRETIME));logger.info("setYzm |end |Redis存储情况:{}",expire);}//获取校验时间,判断是否在一小时内public Boolean getTime(Map<Object, Object> redisMap,DateTimeFormatter format ){logger.info("getTime |start |取校验时间,判断是否在一小时内获取过验证码");String redisTime = redisMap.get(TIME).toString();//String转LocalDatetimeLocalDateTime hourTime = LocalDateTime.parse(redisTime, format);//获取当前时间LocalDateTime now = LocalDateTime.now();//计算时间差,==0 代表一小时内的long betweenHours =  ChronoUnit.HOURS.between(hourTime , now );logger.info("getTime |···· |时间差:{}",betweenHours);if (betweenHours==0) {logger.info("getTime |end |结果是true");return true;}logger.info("getTime |end |结果是false");return false;}@Testpublic void getYzmPlus(){Integer hourCountStart = 1; //一小时生成的次数Integer dayCountStart = 1; //24h生成的次数//指定日期格式(格式化日期)DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//查看验证码次数Map<Object, Object> redisMap = stringRedisTemplate.opsForHash().entries(k);logger.info("验证码:{}",redisMap);Boolean sign = true;if (!redisMap.isEmpty()) {logger.info("验证码不为空,代表24h内不是第一次获取验证码");Integer hourCount = Integer.valueOf(redisMap.get(HOURCOUNT).toString());Integer dayCount = Integer.valueOf(redisMap.get(DAYCOUNT).toString());//判断是否一小时内发过验证码Boolean resut = getTime(redisMap, format);if (resut){if (hourCount==3){logger.info("一小时内获取验证码次数上限了!");throw new RuntimeException("一小时内获取验证码次数上限了!");}sign = false;}if (dayCount == 5){logger.info("24时内获取验证码次数上限了!");//返回throw new RuntimeException("24时内获取验证码次数上限了!");}//校验成功,发送验证码并setsetYzm(format,hourCount+=1,dayCount+=1,sign);}else {logger.info("验证码为空,代表24h内第一次获取验证码");//发送验证码并setsetYzm(format,hourCountStart,dayCountStart,sign);}}}

这篇关于用Redis实现获取验证码,外加安全策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用