SpringBoot校验手机验证码例默认缓存数据淘汰策略redis缓存
目录
本案例实现功能:
1 根据手机号码 生成6位数 的数字 验证码
2 输入手机号和验证码, 判断输入的验证码是否正确 一 默认缓存1.1 主要代码
1 添加依赖 org.springframework.boot spring-boot-starter-cache
2 启用缓存
3 实体类 package com.qing.bean; import lombok.Data; @Data public class SMSCode { private String phoneNum; private String code; }
4 创建验证码的工具类 package com.qing.util; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @Component public class CodeUtils { public String generate(String phoneNum) { int hash = phoneNum.hashCode(); int encryption = 2022630; //异或加密:一种通过异或运算进行加密的算法 //转成二进制,运算规则:相同为0,不同为1,再转成十进制 long result = hash ^ encryption; long nowTime = System.currentTimeMillis(); result = result ^ nowTime; long code = result % 1000000; //处理有负数的情况 code = code < 0 ? -code : code; //六位数:前面补0 String.format("%06d",code); return code + ""; } //获取缓存里的验证码 @Cacheable(key ="#phoneNum" ,value = "cacheCode") public String getCacheCode(String phoneNum){ return null; } }
关于异或运算请点这里
说明:getCacheCode()获取缓存里的验证码的方法,写在工具类这里是因为要使spring的@Cacheable这个注解生效,需要注入spring容器,该工具类在后面的ServiceImpl进行了注入,该方法返回的是注解@Cacheable的value属性值 cacheCode ( 详见后面的测试 )
5 service package com.qing.service; import com.qing.bean.SMSCode; public interface SMSCodeService { //发送验证码 String sendCode(String phoneNum); //检查验证码 boolean checkCode(SMSCode smsCode); }
6 serviceImpl package com.qing.service.impl; import com.qing.bean.SMSCode; import com.qing.service.SMSCodeService; import com.qing.util.CodeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CachePut; import org.springframework.stereotype.Service; @Service public class SMSCodeServiceImpl implements SMSCodeService { @Autowired CodeUtils codeUtils; //发送验证码 @Override //只往里放,不往外读 @CachePut(key = "#phoneNum", value = "cacheCode") public String sendCode(String phoneNum) { return codeUtils.generate(phoneNum); } //比对验证码 @Override public boolean checkCode(SMSCode smsCode) { //取出内存中的验证码与传递过来的验证码比对,相同返回true String code = smsCode.getCode(); String cacheCode = codeUtils.getCacheCode(smsCode.getPhoneNum()); return code.equals(cacheCode); } }
7 controller package com.qing.controller; import com.qing.bean.SMSCode; import com.qing.service.SMSCodeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/sms") public class SMSCodeController { @Autowired private SMSCodeService smsCodeService; @GetMapping("/{phoneNum}") public String getCode(@PathVariable String phoneNum){ return smsCodeService.sendCode(phoneNum); } @PostMapping public boolean checkCode(@RequestBody SMSCode smsCode) { return smsCodeService.checkCode(smsCode); } }1.2 测试
1 生成验证码
2 输入错的验证码验证
3 输入正确的验证码
4 再次生成验证
二 Ehcache缓存
在默认缓存案例的基础上做3个配置就行
1 加依赖 net.sf.ehcache ehcache
2 配置文件
3 ehcache.xml放在resources下
默认缓存
配置新的缓存: name 要和@CachePut注解的的value的属性值一样
三 数据淘汰策略
下图表示的信息:
1 下面的时间分别表示最后一次访问是在 第几秒访问的
2 上面的数字表示 访问了几次
LRU:age 是上次访问离现在的时间最远的
LFU:gender 访问次数是最少的
四 redis缓存4.1 基础使用
在默认缓存的基础上加2个配置
1 导入依赖 org.springframework.boot spring-boot-starter-data-redis
2 配置文件
测试
打开redis的服务端和客户端
关于redis的安装和简单使用在这里
生成一次验证码
数据已经进到redis缓存里了
缓存的名字即这个value属性的值 和 key 电话号码组合成一个新的key一起放进redis缓存里
再生成一次验证码
redis又多了一个缓存数据
4.2 其他配置测有效时间 10s
看一下测试效果
10s之后缓存里的验证码失效了
备注: 超过了有效时长,redis数据里就没有那个缓存了
测前缀
总结
原文 https://blog.csdn.net/m0_45877477/article/details/125539400
中国篮坛历史五大传奇三分手大漠飞刀徐国翀第四,张三疯上榜三分球作为篮球比赛的一种常规武器,在这个小球盛行的时代已毫无疑问的的线性式进化,比如库里这样的球员和勇士这样的球队横空出世,让这个三分雨时代更加精彩。下面我们盘点一下中国篮坛历史射
广厦迎历史最佳阵容!争冠路上只有一个对手!拆解广厦冠军相争冠分析第三期,咱们谈谈多年来的这支劲旅浙江广厦,前两期关于广东和辽宁的争冠分析,得到了网友和粉丝朋友的支持,让小编顿感鼓舞,本期依然绞尽脑汁,奋笔疾书,争取给大家带来有营养的文章
夏威夷怎么来的,又有那些历史,美丽风景的背后又有怎样的危险?夏威夷群岛位于北太平洋中部,是波利尼西亚群岛中最大的次要群岛,共有大小岛屿132个。夏威夷这个词来自波利尼西亚语。公元4世纪左右一批波利尼西亚人利用独木桥破浪定居于此,并将该岛命名
笔游古都9南苑海子朱雀迎宾一期海子景3月14日,天是一改阴霾而阳光明媚,大显春之暖阳,据预报那后几天可是不咋地,趁这空挡与同学一起走起游海子去。您见过乾隆爷海子骑马狩猎吗?我怎么就觉得这小路就是当年乾隆爷策马奔腾那条
国乒拿下WTT大满贯历史首冠,是什么让WTT大满贯如此引人注目?WTT大满贯赛首个冠军属于国乒队。3月16日晚结束的WTT新加坡大满贯赛混双决赛,国乒组合王楚钦孙颖莎3比0横扫中国台北组合林昀儒郑怡静拿下冠军。王楚钦孙颖莎高举冠军奖杯本届大满贯
美联储加息对世界的影响?我国国内有什么影响?美联储加息了,这个靴子终于落地了,加息是美国国内的事,也是世界的大事,这是美元体系造成的,美国加息,远在天边,但影响深远,对各国都有影响?今天说说加息对美国影响的行业?对我国的影响
世界冠军任子威重新加回班级群,竟然还要交作业还记得为了让任子威专心备战冬奥此前老师把他踢出班级群吗但任子威又重新加入了班级群网友们纷纷都说和奥运冠军在一个群可以吹五年,嗯,毕竟是奥运冠军啊,所以当他回归到群聊之后,许多人都开
爱自己,才能爱世界文袁运录一个人如果连自己都不爱,还会爱别人吗?像那种乖乖的孩子,总是逆来顺受,他连自己都不爱,他还会爱这个世界吗?虽然外表乖乖的,那是因为活在虚荣或虚假的状态。他觉得不是为自己而活
世界首富埃隆马斯克发出灵魂拷问,人类家庭应该尽可能多要孩子据3月16日美国有线电视新闻网报道,美国国家航空航天局(NASA)证实了,小行星入侵警报系统(Scout)能够在近地天体接近地球时发出警报。这也是有史以来的第一次。3月11日,匈牙
恰逢花开早,莫负春天好时光文一隅清宁本是烟花三月,空气里却已弥漫着夏天的味道,太阳炽热,温度升高,那一份不属于春天的热切,让人猝不及防。季节的热情高涨,春装还没来得及炫耀,太阳伞墨镜就开始闪亮登场。防护全套
花开湖北诗意中国在这里郁见浪漫人间三月春风更暖花开更繁湖北孝感金卉庄园一场郁金香的浪漫之约开始了!中国红大岛松月阳光樱初美人每一个名字都美得令人悸动正如它的花语爱的表白永恒的祝福愿你星河入眼尽是世间温柔它诉说着