• SpringBoot校验手机验证码案例:默认缓存、Ehcache缓存、数据淘汰策略、redis缓存


    目录

    一 默认缓存

    1.1 主要代码

    1.2 测试

    二 Ehcache缓存

    三 数据淘汰策略

     四 redis缓存

    4.1 基础使用

    4.2 其他配置


    本案例实现功能:

    1 根据手机号码生成6位数的数字验证码

    2 输入手机号和验证码,判断输入的验证码是否正确

    一 默认缓存

    1.1 主要代码

    1 添加依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-cache</artifactId>
    4. </dependency>


    2 启用缓存

    3 实体类

    1. package com.qing.bean;
    2. import lombok.Data;
    3. @Data
    4. public class SMSCode {
    5. private String phoneNum;
    6. private String code;
    7. }


    4 创建验证码的工具类

    1. package com.qing.util;
    2. import org.springframework.cache.annotation.Cacheable;
    3. import org.springframework.stereotype.Component;
    4. @Component
    5. public class CodeUtils {
    6. public String generate(String phoneNum) {
    7. int hash = phoneNum.hashCode();
    8. int encryption = 2022630;
    9. //异或加密:一种通过异或运算进行加密的算法
    10. //转成二进制,运算规则:相同为0,不同为1,再转成十进制
    11. long result = hash ^ encryption;
    12. long nowTime = System.currentTimeMillis();
    13. result = result ^ nowTime;
    14. long code = result % 1000000;
    15. //处理有负数的情况
    16. code = code < 0 ? -code : code;
    17. //六位数:前面补0
    18. String.format("%06d",code);
    19. return code + "";
    20. }
    21. //获取缓存里的验证码
    22. @Cacheable(key ="#phoneNum" ,value = "cacheCode")
    23. public String getCacheCode(String phoneNum){
    24. return null;
    25. }
    26. }

    关于异或运算请点这里

    说明:getCacheCode()获取缓存里的验证码的方法,写在工具类这里是因为要使spring的@Cacheable这个注解生效,需要注入spring容器,该工具类在后面的ServiceImpl进行了注入,该方法返回的是注解@Cacheable的value属性值 → cacheCode (详见后面的测试)

    5 service

    1. package com.qing.service;
    2. import com.qing.bean.SMSCode;
    3. public interface SMSCodeService {
    4. //发送验证码
    5. String sendCode(String phoneNum);
    6. //检查验证码
    7. boolean checkCode(SMSCode smsCode);
    8. }


    6 serviceImpl

    1. package com.qing.service.impl;
    2. import com.qing.bean.SMSCode;
    3. import com.qing.service.SMSCodeService;
    4. import com.qing.util.CodeUtils;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.cache.annotation.CachePut;
    7. import org.springframework.stereotype.Service;
    8. @Service
    9. public class SMSCodeServiceImpl implements SMSCodeService {
    10. @Autowired
    11. CodeUtils codeUtils;
    12. //发送验证码
    13. @Override
    14. //只往里放,不往外读
    15. @CachePut(key = "#phoneNum", value = "cacheCode")
    16. public String sendCode(String phoneNum) {
    17. return codeUtils.generate(phoneNum);
    18. }
    19. //比对验证码
    20. @Override
    21. public boolean checkCode(SMSCode smsCode) {
    22. //取出内存中的验证码与传递过来的验证码比对,相同返回true
    23. String code = smsCode.getCode();
    24. String cacheCode = codeUtils.getCacheCode(smsCode.getPhoneNum());
    25. return code.equals(cacheCode);
    26. }
    27. }


    7 controller

    1. package com.qing.controller;
    2. import com.qing.bean.SMSCode;
    3. import com.qing.service.SMSCodeService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.web.bind.annotation.*;
    6. @RestController
    7. @RequestMapping("/sms")
    8. public class SMSCodeController {
    9. @Autowired
    10. private SMSCodeService smsCodeService;
    11. @GetMapping("/{phoneNum}")
    12. public String getCode(@PathVariable String phoneNum){
    13. return smsCodeService.sendCode(phoneNum);
    14. }
    15. @PostMapping
    16. public boolean checkCode(@RequestBody SMSCode smsCode) {
    17. return smsCodeService.checkCode(smsCode);
    18. }
    19. }

    1.2 测试

    1 生成验证码

     2 输入错的验证码验证

     

     3 输入正确的验证码

     4 再次生成验证

    二 Ehcache缓存

    在默认缓存案例的基础上做3个配置就行

    1 加依赖

    1. <dependency>
    2. <groupId>net.sf.ehcache</groupId>
    3. <artifactId>ehcache</artifactId>
    4. </dependency>

    2 配置文件

     3 ehcache.xml放在resources下

    默认缓存

     配置新的缓存:name要和@CachePut注解的的value的属性值一样

     

    三 数据淘汰策略

    下图表示的信息:

    1 下面的时间分别表示最后一次访问是第几秒访问的

    2 上面的数字表示访问了几次

    LRU:age → 是上次访问离现在的时间最远的

    LFU:gender → 访问次数最少的

     四 redis缓存

    4.1 基础使用

    在默认缓存的基础加2个配置

    1 导入依赖

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-data-redis</artifactId>
    4. </dependency>

    2 配置文件

     测试

    打开redis的服务端和客户端

    关于redis的安装和简单使用在这里

    生成一次验证码

     数据已经进到redis缓存里了

     把缓存的名字即这个value属性的值 和 key 电话号码组合成一个新的key一起放进redis缓存里

     再生成一次验证码

    redis又多了一个缓存数据

    4.2 其他配置

     测有效时间 10s

     看一下测试效果

     10s之后缓存里的验证码失效了

     备注:超过了有效时长,redis数据里就没有那个缓存了​​​​​​​

     测前缀

     

     总结

  • 相关阅读:
    力扣每日一题-第27天-561.数组拆分Ⅰ
    [附源码]java毕业设计某互联网公司人力资源管理系统
    第三章《数组与循环》第7节:break与continue关键字
    LeetCode - 611.有效三角形个数
    已更新!c++第四章知识点合集(自定义函数的格式和使用方法详解, #include,函数的嵌套 递归,局部变量与全局变量的区别等等)
    造轮子之集成GraphQL
    PIE-Engine 教程:水稻面积提取1(宿迁市)
    mysql查询排名
    Qt(day4)
    开源量子开发框架 Cirq
  • 原文地址:https://blog.csdn.net/m0_45877477/article/details/125539400