天天快消息!Java/Kotlin 使用Redis模拟发送验证码
原文地址: Java/Kotlin 使用Redis模拟发送邮件验证码 - Stars-One的杂货小窝
(资料图)
Java中常用语连接Redis的库有lettuce
和jredis
,一般是推荐lettuce
,其具有异步性,下面两种都简单来使用如何实现功能
redis.clients jedis 3.2.0
脚本使用:
fun main() { //1.测试连接 val jedis = Jedis("127.0.0.1", 6379) val resp = jedis.ping() //为pong即为可用的 if (resp == "PONG") { val key = "mykey" val value = "hello world" //写入数据 jedis[key]=value //读数据 val result = jedis[key] println(result) // 删除指定key val row = jedis.del(key) //影响的行数 println(row) //设置60s后过期 jedis.setex(key,60,value) //设置60ms后过期 jedis.psetex(key,60,value) //剩余的过期时间,ttl返回时间单位为s,pttl则是ms val time = jedis.ttl(key) val time = jedis.pttl(key) }}
通过setex
或psetex
方法来设置过期时间后,当数据过期后,再次去查询该数据,就会得到null(即redis将数据删除了)
上述也是简单演示了redis数据库的增删改查功能,下面就利用此数据库来实现发送验证码的功能。
2.发送验证码这里我是实现了邮箱发送验证码的功能,验证码定为6位纯数字随机数,当然,你也可以加上大小写字母来提高复杂性。
之后我们将邮箱和验证码存储到redis中,并设置十分钟过期时间,随后通过调用邮箱发送邮件的方法,将验证码发送出去(这里详见JavaXMail发送邮件功能实现)
下面是验证码生成方法:
//生成验证码fun randomCode(): String { val sb = StringBuffer() repeat(6) { //0-9范围 val num = Random.nextInt(0, 10) sb.append(num) } return sb.toString()}//发送验证码方法fun sendCode(email: String) { val code = randomCode() //先判断redis是否有记录 val oldCode = RedisUtil.getValue(email) val action = { RedisUtil.setKeyValue(email, code) //调用邮箱发送邮件方法 sendEmail(email, code) } if (oldCode.isBlank()) { action.invoke() } else { //判断是否已过1分钟 //已过一分钟,重新发送,否则不做操作 val flag = RedisUtil.isGtOneMinutes(email) if (flag) { action.invoke() } }}object RedisUtil { private val url = "127.0.0.1" //10分钟 private const val expiredTime = 10 * 60 private val redis by lazy { val jedis = Jedis(url, 6379) //如果有设置密码 // jedis.auth("") jedis } /** * 获取数据 */ fun getValue(key: String): String { return redis[key] ?: "" } /** * 存储邮箱和验证码 */ fun setKeyValue(key: String, value: String) { redis.setex(key, 10 * 60, value) } /** * 获取指定key的剩余时间(s) */ fun getSurplusTime(key: String): Long { return redis.ttl(key) } /** * key是否已过1分钟 */ fun isGtOneMinutes(key: String): Boolean { val time = getSurplusTime(key) //小于九分钟(说明已过1分钟) return time <= expiredTime - 60 }}
这里补充下,由于邮箱为用户输入,永远不要对用户输入抱有期待,用户可能输入不是个email地址或者输了个不存在的email地址,对于前者问题,我们可以通过在前端和后台增加一个邮箱格式验证,对于后者问题(不存在的email地址),没有什么验证办法,只有发送了才知道这个邮箱地址是否可用(可以使用try catch来捕获异常来处理)
所以如果发送邮件出现错误,我们需要进行对应的处理,把那条存储到redis数据删除,然后接口返回一个错误提示信息即可。
而且,为了考虑到恶意用户频繁操作,导致我们邮箱服务频繁发送邮件,我们也需要进行对应的考虑设置,这里只能顾全用户频繁输入单个邮箱的情况,如果是同个邮箱,我们设置验证码过了1分钟的时间,才给重新发送(即现在各大APP手机验证码的操作一样),前端和后台接口都是需要做限制。
如果是重新发送的话,我们需要重新setex
方法设置一下验证码,同时这步也将过期时间重置了。
之后就是考虑校验验证码的情况了,这里也是比较简单,通过拿到用户输入的验证码和redis里面的进行比对就可校验。
但可能会有特殊情况,比如redis验证码已经过期了,需要进行判断,并自动重新发送邮件,且接口返回提示信息
fun checkCode(email: String, code: String):Boolean { val dbCode = RedisUtil.getValue(email) if (dbCode.isBlank()) { //重新发送邮件,并发送提示(这里省略了发送提示) sendCode(email) return false } else { if (dbCode==code) { //验证通过 return true } return false }}
lettuceLettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API,5.1版本的新特性如下:
支持Redis的新增命令ZPOPMIN, ZPOPMAX, BZPOPMIN, BZPOPMAX。支持通过Brave模块跟踪Redis命令执行。支持Redis Streams。支持异步的主从连接。支持异步连接池。新增命令最多执行一次模式(禁止自动重连)。全局命令超时设置(对异步和反应式命令也有效)。下面这里就稍微贴下代码就好,具体的思路上面已经都有提及了,就不再过多赘述了。
1.引入依赖如果项目为Spring Boot,只需要引用spring-data-redis依赖即可,其内置默认使用lettuce此库来连接redis
org.springframework.data spring-data-redis 2.0.5.RELEASE
或者是单独使用,则直接引用lettuce库即可
io.lettuce lettuce-core 5.0.2.RELEASE
2.使用val redisUri = RedisURI.builder() // <1> 创建单机连接的连接信息 .withHost("localhost") .withPort(6379) .withTimeout(Duration.of(10, ChronoUnit.SECONDS)) .build()val redisClient = RedisClient.create(redisUri) // <2> 创建客户端val connection = redisClient.connect() // <3> 创建线程安全的连接val redisCommands = connection.sync() // <4> 创建同步命令//这里的参数说明可以访问http://redis.io/commands/set查看//ex就是设置5s的过期时间val setArgs = SetArgs.Builder.nx().ex(5)//获取剩余过期时间redisCommands.ttl("name")//设置数据val result = redisCommands.set("name", "throwable", setArgs)if (result.toLowerCase() == "ok") { println("成功插入数据")}connection.close() // <5> 关闭连接redisClient.shutdown() // <6> 关闭客户端
Lettuce结构比较复杂,上面罗列的基本使用已经够用了,就没有深入研究下去了...
其他不过最近找了一款后台框架,写的时候发现,它是用的RedisTemplate,似乎比Lettuce要早一些的技术栈了,稍微摸索了下也能使用,也没去替换了那个后台框架里的东西了
//存入数据并设置时间stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.HOURS);//删除stringRedisTemplate.delete(key);//获取剩余到期时间redisTemplate.getExpire(key, TimeUnit.MINUTES);
参考使用Java操作Redis_java使用redis_一心同学的博客-CSDN博客RedisTemplate操作Redis,这一篇文章就够了(一)_ha_lydms的博客-CSDN博客Redis高级客户端Lettuce详解_lettuce客户端_倾听铃的声的博客-CSDN博客
标签:
推荐文章
- 天天快消息!Java/Kotlin 使用Redis模拟发送验证码
- 欧泊石和钻石哪个贵 欧泊石和蛋白石区别
- 不明觉厉的真正意思_不明觉厉
- 世界看热讯:麻辣豆腐皮怎么做
- 天天简讯:苹果CEO库克现身北京三里屯Apple Store零售店
- 2020款雅阁和10代雅阁的区别_2020款雅阁有什么改进
- 【全球独家】重庆发布2023年供地计划 重点保障基础设施建设和产业用地
- 钉螺_世界快资讯
- 全球即时:鸟类迁徙是为什么
- 北向资金今日净卖出2.34亿元 立讯精密净买入额居首 环球精选
- 上海通报12批次不合格产品 亚都牌加湿器登榜
- 2023年贷款利率能改么?根据四种不同贷款类型介绍不同调整方式|热讯
- 焦点速讯:老人推倒摩托继承人被判赔1.6万余元具体详细内容是什么
- 【全球快播报】海南椰岛回应上交所问询:拍卖程序结束后国资公司或成实控人
- 榆海万泉河畔(关于榆海万泉河畔介绍)_天天头条
- 九吉公的主要功效有哪些
- 东方绯想天怎么全屏_东方绯想天1 06
- 全球微速讯:湖南岳塘国际商贸城违法销售格子铺,并单方违约
- 中国电信净利276亿天翼云收入翻倍 拟派现179亿分红大幅提升至65%|天天速看
- 环球快讯:文言实词:退
- 四轮定位多少钱一次吉利_四轮定位多少钱一次
- 每日信息:王杨:黄金1982反手多,黄金大涨获利收割!
- 皮肤保养知识|关注
- 浙江省电信网上营业厅下载安装_浙江电信网上营业厅网上营业厅
- 头悬梁讲的是什么故事_头悬梁是什么意思 环球速讯
- 李宗伟的顽强抗癌路:30天接受33次电疗,吃饭得借助麻药
- 常州露营谷音乐节购票官网-快资讯
- 开发区组织部(人社局)召开创文工作推进会
- 黄元申为什么出家 世界速看
- “路里虎气”的 奇瑞TJ-1实车图曝光,有望今年夏季上市-全球看点
- 建议增发特别国债,把所有的地方债全盘接手过去,给地方政府减负|全球聚焦
- 环球热讯:天津东丽城投3亿元私募债状态更新为“已反馈”
- 北方再迎大范围沙尘:今春缘何风沙多?
- 我市举办“世界水日” “中国水周”系列活动 世界要闻
- Dota2赏金猎人出装
- 富国上海金ETF净值下跌1.44% 请保持关注
- 今日视点:李代桃僵的意思解释_李代桃僵的意思
- 概率对数空间层谱塌陷
- 如何煮饺子不破皮?
- 当年高考成绩各科分数怎么查询 全球今日讯
- ST路通(300555):特定股东减持股份的预披露公告
- 4-1,近5场首胜!中国男足踢疯了,国足C罗梅开二度,剑指世少赛_时讯
- 河北威县:经验交流提升“带班”智慧 全球微资讯
- 华铁股份推行智慧高效节水管理,善用水资源_世界讯息
- 济南大学分数线够了好进吗_济南大学分数线
- 采纳股份股东户数增加2.65%,户均持股22.7万元|全球聚看点
- 港股公告精选|零跑汽车2022年营收增长率近300%;腾讯音乐第四季度净利润同比增114.7%
- 哪个穴位可以缓解痛经_经期缓解痛经的饮食 经期吃什么可以缓解痛经_世界快消息
- 剑灵怀旧服官方_剑灵怀旧服
- 性能狂飙 高能体验 联想拯救者2023全线生态新品强势发布
- 3.21收评:好饭不怕晚,别把反弹当反转!
- 成都熊猫基地在什么地方?(成都的熊猫基地在哪里啊) 当前热门
- 92岁默多克宣布将第5次结婚,有四任前妻6子女,今娶66岁寡妇-看热讯
- 保龄宝:公司非公开发行 A 股股票申请已获得中国证监会发行审核委员会审核通过-环球观热点
X 关闭
最新资讯
- 现代作家与当代作家的区别_现代作家-天天报资讯
- 弹丸论破盾子最后怎么样了(弹丸论破盾子) 世界观点
- 奥克斯手机M236怎样打开mrp软件_分享给大家
- 天天实时:菜粕期货走出空头行情,空头致富机会来临
- 每日速递:一拜天地_一拜天地讲的是什么故事
- 天天快看点丨日本社会哪些领域状况恶化?调查对象首选物价
- 买房陷阱0容忍!这份消费者成功维权指南请查收 世界快看
- 科技资讯:苹果xsmax:苹果xsmax的尺寸大小
- 滨海公路旁发现大片6亿多年前的玫瑰石_全球焦点
- 东方银星董秘回复:公司定位“双碳”服务运营商,充电服务采用的充换电设备目前为外购
- 人保寿险百万身价惠民两全保险是投资型保险吗_人保寿险百万身价惠民两全保险
- 环球热门:周至辣椒酱制作方法?
- 巴萨社媒晒梅西昔日对阵皇马照片:的国家德比照_世界快看点
- 热文:《铃芽之旅》北大首映,新海诚:希望给大家带来治愈与勇气
- 笔记本电脑充电显示电源已接通未充电怎么解决_笔记本电脑充电显示电源已接通未充电|天天新要闻
- 环球即时:喝薏仁水的功效与作用_喝薏仁水的功效
- 虚拟机如何安装系统?_虚拟机如何安装系统 环球滚动
- 夏季健康饮食小常识简短_夏季健康饮食小常识 今日快看
- 要闻速递:拜登收多个坏消息,美银行破产,耶伦想来访华求助,中国会帮忙吗
- 上海高中学业水平考试时间2023-上海高中等级考试时间2023
- 花非花雾非雾第三部_快乐大本营花非花雾非雾剧组 每日简讯
- 03月18日06时山东淄博昨日累计报告阳性感染者确诊121例 怎么判断自己是否属于轻型感染者|环球快讯
- 科技要闻:海信在人民日报社正式发布海信单水墨屏阅读手机A5 环球关注
- 天天观点:北京轨道交通“机器人家族”上新 地铁列车巡检机器人亮相
- dllcare注册码_advanced systemcare 12注册码
- 全球通讯!本阿尔法_关于本阿尔法的介绍
- 动态:海运和河运的运力成本比较
- 环球微头条丨天亿马盘中异动 股价振幅达7.67% 上涨7.25%
- 打造史无前“利”钜惠!传祺以“价格”与“价值”突出重围_全球快消息
- CDC:所有成年人都应接受乙型肝炎筛查_全球热资讯
- 无惧硅谷银行倒闭、瑞信危机影响,欧央行如期加息50个基点 热推荐
- 财报速递:能辉科技2022年全年净利润2614.27万元,总体财务状况一般-环球讯息
- 刺客信条奥德赛修改器全功能版(最新版推荐) 环球快看点
- 关于龙的经典名句_关于龙的霸气诗句
- 桂林阳朔警方联合烟草局集中销毁假烟24万支,涉案价值21余万元! 观察
- 认识阿尔伯特迈凯伦Speedtail之一向F1测试骡子致敬 天天微头条
- 卖掉公司的车账务怎么处理-公司卖车账务处理
- 世界快看:兴蓉环境:目前公司在成都及周边区域(如彭州、邛崃)实施多个餐厨垃圾项目
- 每日播报!金属桥架生产厂家_金属桥架
- 维珍轨道公司暂停运营一周:员工休无薪假,股价暴跌50%_微动态
- 03月16日00时广东珠海疫情数据 阳了以后为什么会腰疼?应该怎么办?
- 世界报道:2023太马5月开赛!35000人规模创历史最高
- 疯狂心动!爆红九江人朋友圈的樱花大道,快去打卡!
- 微量差示扫描热量仪|环球快播报
- 八旬老人银行账号大额异动 警银联手挽回204万元损失
- 山东高密蓝天环保工程有限公司-今日热门
- 观点:承诺返还差价 零跑汽车发布90天保价
- 有棵树:公司实际控制人被动减持暂不会导致公司控制权发生变更_焦点热议
- 莱比锡主帅:哈兰德头顶脚踢进球太饥饿了 我们一直没进入比赛 全球观速讯
- 焦点热议:我的一天作文开头结尾摘抄(我的一天 作文 好的开头结尾)
X 关闭