【开发篇】十、Spring缓存:手机验证码的生成与校验

这篇具有很好参考价值的文章主要介绍了【开发篇】十、Spring缓存:手机验证码的生成与校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、缓存

  • 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质
  • 使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
  • 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

注意最后这条,缓存的不一定就是从持久层数据库来的数据,也可以是程序运行的临时数据,理解别太狭义,如手机验证码,对应于下图的Cache1:

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

2、用HashMap模拟自定义缓存

传统的一个查询接口,每次都查需要去和数据库交互,数据库压力大且容易产生性能瓶颈:

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java
【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

在Service层引入一个Map类型的非局部变量,来模拟缓存:(这种使用一个Map来充当临时缓冲池的思想需要学习

private HashMap<Integer,Book> cache = new HashMap<>();

@Override
public Book getBookById(Integer id){

	Book book = cache.get(id);
	
	if(book == null){
		book = bookDao.selectById(id);
		cache.put(id,book);
	}
	
	return book;
}

此时调用之前的接口,除了第一次需要查数据库,后面直到服务重启,变量被回收,都不用再去查数据库。同理,写个手机验证码的demo代码:

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

看下效果:

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java
【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

3、SpringBoot提供缓存的使用

首先导入缓存技术对应的starter:

<dependency>    
	<groupId>org.springframework.boot</groupId>    
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

配置配或者直接启动类上加@EnableCaching启动缓存

@SpringBootApplication

@EnableCaching  //!!!!

public class SpringbootApplication {    

	public static void main(String[] args) {
	
		SpringApplication.run(SpringbootApplication.class, args);    
		
	}
}

此时,上面用HashMap模拟缓存的Service码就可改为:

@Cacheable(value="cacheSpace",key="#id")

public Book getById(Integer id) {    

	return bookDao.selectById(id);
	
}

即先从cacheSpace这块缓存空间查看,有则返回,没有再查持久层。@Cacheable注解,即以属性里的key值为键,以方法的返回值为value,既存又取,有则取,无则查后存。 以上是背后使用的缓存技术是SpringBoot默认的Simple。SpringBoot提供的缓存技术除了提供默认的缓存方案外,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理:

  • Generic
  • JCache
  • Ehcache
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple(默认)
  • memcached

4、手机验证码案例完善

引入@Cacheable注解后,重写并完善下这个验证码的案例。先写个工具类来生成验证码,这个工具类写的不优雅,重点备份下补0串的这种思想吧:

public class CodeUtil {

    private static final String[] patch = {"000000","00000","0000","000","00","0",""};

    public static String generatorCode(String tel){
        int hash = tel.hashCode();
        int encryption = 20230927;  //加密常量码
        long result = hash ^ encryption;  //第一次加密,此时,我加密码写死,同一个电话号码的验证码会一直不变
        long nowTime = System.currentTimeMillis();
        result = result ^ nowTime;  //引入时间,二次加密
        long code = Math.abs(result % 1000000);  //取后六位
        String codeStr = code + "";  //也可能不够6位,比如000147,则上面的long code就是147
        return patch[codeStr.length()] + codeStr;  //加一个补0数组,根据字符串长度来取对应的补0串,最多补5个0,最少不补,这里为了适配数组下标从0开始,给array[0]给个值
    }
}

注意根据字符串长度来取数组中对应的补0串时,长度为6,则取array[6],但数组下标从0开始,会越界:

【开发篇】十、Spring缓存:手机验证码的生成与校验,SpringBoot,spring,缓存,java

此时有两种思路处理,一种是上面的,给数组加个下标为0的值,此时str.length()就和数组下标对应上了,也可以直接让str.length()-1:

return patch[codeStr.length() -1 ] + codeStr;

Service层,生成验证码,并存缓存,不能用@Cacheable,它既存又取,这样验证码在缓存失效前都一样,可改为@CachePut只存不取

@Service
@Slf4j
public class MsgServiceImpl implements MsgService {

    @Resource
    @Lazy  //解决下循环以来的问题
    MsgService msgService;

    /**
     * 返回验证码
     * @param tel
     * @return
     */
    @Override
    //@Cacheable(value = "telCode",key = "#tel")
    @CachePut(value = "telCode",key = "#tel")
    public String getCheckCode(String tel) {
        String checkCode = CodeUtil.generatorCode(tel);
        return checkCode;
    }

    /**
     * 校验验证码
     * @param tel
     * @param checkCode
     * @return
     */
    @Override
    public boolean verify(String tel, String checkCode) {

        return checkCode.equals(msgService.getCode(tel));
    }

    @Override
    @Cacheable(value = "telCode",key = "#tel")
    public String getCode(String tel){
        return null;
    }
}

关于校验方法里的取验证码,之前写需求用redis,直接redisTemplate.get了,但这里底层缓存技术是Simple,可单独写个方法,上面加@Caceable注解,然后校验方法里调用这个获取缓存值的方法即可实现(此时会有@Cacheable注解失效问题,注意出去绕一圈拿代理对象来调用)。还是利用了@Cacheable注解的特点,先查有无这个key,有就把value当作这个方法的返回值,没有再执行代码方法体。

@Cacheable(value = "telCode",key = "#tel")
public String getCode(String tel){
    return null;
}

Controller层随便写就行:

@RestController
@RequestMapping("/msg")
public class MsgController {

    @Resource
    MsgService msgService;

    @GetMapping("{tel}")
    public String getCode(@PathVariable String tel){
        return msgService.getCheckCode(tel);
    }

    @PostMapping
    public Boolean verifyCode(@RequestParam String tel,String code){
        return msgService.verify(tel,code);
    }
}

重点关注:文章来源地址https://www.toymoban.com/news/detail-730800.html

  • 工具类中加密使用了一个补0数组的思想
  • @Cacheable既存又取,这样验证码在缓存失效前都一样,可改为@CachePut只存不取
  • @Cacheable注解因方法内部调用而失效的解决
  • 不用Redis,再取数据时,引入了一个方法,加@Cacheable注解并返回null,即查到这个key的值就返回,否则返回方法的返回值,即null

到了这里,关于【开发篇】十、Spring缓存:手机验证码的生成与校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022.9.17 vue、element-ui实现登录获取手机验证码,进行手机号校验、验证码CD60秒

    1、直接点击,不为空校验 2、输入手机号格式不正确时 3、获取完验证码进行读秒 三、vue 1、进行手机号校验关键在对单个手机号输入框进行校验,需要使用到validateField对部分表单字段进行校验,valid是校验完的提示信息,当valid为空时代表校验成功 2、读秒和设置禁用,在校

    2024年02月11日
    浏览(47)
  • 【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

    😀如果对你有帮助的话😊 🌺为博主点个赞吧 👍 👍点赞是对博主最大的鼓励😋 💓爱心发射~💓 bofryuzursekbiab——密码 访问邮箱域名 邮箱端口 账号 密码 协议 详细配置 JavaMailSender 是 Spring Email 的核心组件,负责发送邮件 MimeMessage 用于封装邮件的相关信息 MimeMessageHelper 用

    2024年02月06日
    浏览(57)
  • 完美实现校验:利用Spring Validation实现强大的输入验证

    校验例子 大家平时编码中经常涉及参数的校验,对于一个用户注册的方法来说会校验用户名密码信息: 上述例子中需要手动编写参数校验逻辑的过程。虽然对于这个简单的示例而言,手动编写校验逻辑可能是可行的,但是对于复杂的验证规则和多个参数的情况,手动编写校

    2024年01月20日
    浏览(39)
  • CRC(循环冗余校验码的校验方法)

    5个关键点: 1.信息码:即给出要校验的二进制码 2.生成多项式:一般多项式会给,从最高位的指数位数就可以得到有几个校验码;如果没给多项式,肯定会给个多项式二进制码,根据它来推就行(具体推的规律,下面会讲) 3.校验位:由多项式的最高位指数得出 4.多项式对应

    2024年02月08日
    浏览(42)
  • uniapp、vue、小程序常用的一些验证规则校验方法(例如:手机号。身份证、金额等)

    例如: 检查是否为空数组 、是否是空  不为空false 为空true、校验密码、校验手机号格式、校验邮箱格式、校验身份证号格式、校验值长度 不少于6位数、 电话号码加密   15288889999 转化为 152****9999、身份证号码加密、验证输入重量、金额等类型   例如 0.11  2.23  100.123等等

    2024年02月02日
    浏览(56)
  • 奇偶校验码 ,奇偶校验码检错原理,奇偶校验码的缺点。

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」: 此文章已录入专栏《计算机网络零基础快速入门》 什么是奇偶校验码? 奇偶校验码是怎么检错的? 奇偶校验码有什么缺点? 奇偶校验码是奇

    2024年02月03日
    浏览(35)
  • SpringBoot实现图形验证码功能+访问频率设置+缓存

    目录 1、springboot实现图形验证码生成 1.1、导入Maven依赖 1.2、写一个生成图片的工具类 1.3、编写接口生成验证码并存入Redis 2、实现图形验证码判断是否正确 2.1、编写验证图形验证码接口 2.2、前端代码 2.3、请求发送 3、实现访问频率限制 3.1、创建自定义注解 3.2、创建自定义

    2024年04月17日
    浏览(39)
  • Java21 + SpringBoot3集成easy-captcha实现验证码显示和登录校验

    近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。 本项目为前后端分离开发,后端基于 Java21 和 SpringBoot3 开发,后端使用 Spring Security 、 JWT 、 Spr

    2024年01月23日
    浏览(63)
  • springboot的文件缓存(easy-captcha 验证码)

    springboot使用缓存的方法 (这里我们来说使用 springboot 默认的文件缓存) 其实 springboot 使用了 CatchManager 来管理缓存,有了它, 我们就可以缓一的使用各种各样的缓存, 比如 ConcurrentCatchMap redis 等缓存, 它们的使用方法都是一样的 用法 引入 yml 中配置 开启缓存 在任何一个

    2024年02月10日
    浏览(47)
  • 手机验证发送及其验证(基于springboot+redis)保姆级

    验证码的有效期:验证码应该有一定的有效期,一般设置为几分钟或者十几分钟。过期的验证码应该被认为是无效的,不能用于验证用户身份。 手机号码格式的校验:应该对用户输入的手机号码进行格式校验,确保其符合手机号码的格式要求。例如,手机号码应该是11位数字

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包