当前位置: 首页 > news >正文

Redis中设置验证码

         限制一分钟内最多发送5次,且每次有效时间是5分钟!

String 发送验证码(phoneNumber) {key = "shortMsg:limit:" + phoneNumber;// 设置过期时间为 1 分钟(60 秒)// 使⽤ NX,只在不存在 key 时才能设置成功bool r = Redis 执⾏命令:set key 1 ex 60 nxif (r == false) {// 说明之前设置过该⼿机的验证码了long c = Redis 执⾏命令:incr keyif (c > 5) {// 说明超过了⼀分钟 5 次的限制了// 限制发送return null;}}// 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次String validationCode = ⽣成随机的 6 位数的验证码();validationKey = "validation:" + phoneNumber;// 验证码 5 分钟(300 秒)内有效Redis 执⾏命令:set validationKey validationCode ex 300;// 返回验证码,随后通过⼿机短信发送给⽤⼾return validationCode ;
}
// 验证⽤⼾输⼊的验证码是否正确
bool 验证验证码(phoneNumber, validationCode) {validationKey = "validation:" + phoneNumber;String value = Redis 执⾏命令:get validationKey;if (value == null) {// 说明没有这个⼿机的验证码记录,验证失败return false;}if (value == validationCode) {return true;} else {return false;}
}

在Redis中设置验证码是一种常见且有效的安全措施,主要用于验证用户身份和防止滥用服务。以下是如何在Redis中有效地设置和管理验证码的详细步骤:

  1. 生成验证码
    • 生成方式:通常使用随机算法生成一个固定长度(如4位或6位)的数字或字母组合作为验证码。例如,可以使用Java中的Random类生成一个6位数的验证码。
    • 代码示例
      public static String getCode(){Random random = new Random();String code = "";for (int i = 0; i < 6; i++) {int rand = random.nextInt(10);code += rand;}return code;
      }
      
  2. 存储验证码
    • Redis命令:使用SET命令将生成的验证码存储在Redis中,键名通常为“手机号_验证码”,值为验证码字符串本身。同时,为了确保验证码只在一段时间内有效(如1分钟或2分钟),需要使用EXPIRE命令设置验证码的过期时间。
    • 代码示例
      String ip = req.getRemoteAddr();
      String yzm = this.getYzm();
      ValueOperations forValue = rt.opsForValue();
      forValue.set(ip+"_yzm", yzm);
      rt.expire(ip+"_yzm", 60*1000);
      
  3. 发送验证码
    • 发送途径:通过短信网关API发送验证码到用户手机,这通常需要集成第三方短信服务商提供的SDK或API。发送完成后,用户手机会收到一条包含验证码的短信。
    • 注意事项
      • 安全性:确保在发送验证码之前进行必要的验证,如检查手机号格式是否正确,以及是否在短期内重复发送请求。这可以通过在Redis中另外存储发送次数来实现。
      • 限流:为了防止恶意攻击,可以限制每个手机号在一定时间内只能发送有限次数的验证码。具体实现时,可以在Redis中用另一个键记录发送次数,每次发送增加计数器,并检查是否超过限制。
  4. 校验验证码
    • 验证流程:用户在界面输入收到的验证码后,系统从Redis中取出与该手机号关联的验证码进行比对。如果一致且未过期,则验证通过;否则,提示验证码错误或已过期。
    • 代码示例
      public static void getRedisCode(String phone, String code){Jedis jedis = new Jedis("host", 6380);jedis.auth("密码");String codeKey = "VerifyCode" + phone + ":code";String s = jedis.get(codeKey);if (code.equals(s)){System.out.println("验证成功");} else {System.out.println("失败");}
      }
      
  5. 管理验证码
    • 超时处理:由于每个验证码都有有效期,因此需确保过期的验证码能够及时从Redis中清除,以避免数据堆积。通过合理设置Redis的过期时间自动清理机制,可以实现这一点。
    • 性能优化:在高并发场景下,使用Redis集群来分散读写压力,提高验证码的存取效率。

        综上所述,通过上述步骤,可以在Redis中有效地设置和管理验证码,以增强系统的安全性和用户体验。在实际应用中,根据具体需求调整细节,可以达到更好的效果。

http://www.lryc.cn/news/387322.html

相关文章:

  • 使用hadoop进行数据分析
  • 架构师篇-7、企业安全架构设计及实践
  • 递归算法~快速排序、归并排序
  • DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手
  • RAG 检索增强生成有效评估
  • Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
  • sqlalchemy分页查询
  • Java--常用类APl(复习总结)
  • 【股指期权投教】一手股指期权大概多少钱?
  • mmap()函数和munmap()函数的例子
  • 计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)
  • VUE实现简易购物车
  • 混沌工程——从捣乱的视角看系统稳定性
  • Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例
  • 5G频段简介
  • 【python学习】bytearray 数组
  • Labview_Occurrencel(事件发生)
  • 天气网站爬虫及可视化
  • 【python - 数据】
  • 几种热管的构造
  • 【GitOps】使用Google工具JIB实现本地无需安装容器推送镜像,加速SpringCloud项目开发
  • 【proteus经典实战】16X192点阵程序
  • 小白上手AIGC-基于FC部署stable-diffusion
  • 一些指标的学习
  • dledger原理源码分析系列(三)-选主
  • 如何修改PDF文档的作者名称?
  • 从笔灵到AI去痕:全方位提升内容创作与学术诚信
  • 考试如果出现汉诺塔问题怎么办?
  • 导出word模板开发记录
  • PHP爬虫类的并发与多线程处理技巧