Java/Kotlin 使用Redis模拟发送验证码

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

原文地址: Java/Kotlin 使用Redis模拟发送邮件验证码 - Stars-One的杂货小窝
Java中常用语连接Redis的库有lettuce和jredis,一般是推荐lettuce,其具有异步性,下面两种都简单来使用如何实现功能
jredis

1.引入依赖
  1. <dependency>
  2.     <groupId>redis.clients</groupId>
  3.     <artifactId>jedis</artifactId>
  4.     <version>3.2.0</version>
  5. </dependency>
复制代码
脚本使用:
  1. fun main() {
  2.     //1.测试连接
  3.     val jedis = Jedis("127.0.0.1", 6379)
  4.     val resp = jedis.ping()
  5.     //为pong即为可用的
  6.     if (resp == "PONG") {
  7.         val key = "mykey"
  8.         val value = "hello world"
  9.         //写入数据
  10.         jedis[key]=value
  11.         //读数据
  12.         val result = jedis[key]
  13.         println(result)
  14.         //  删除指定key
  15.         val row = jedis.del(key)
  16.         //影响的行数
  17.         println(row)
  18.         
  19.         //设置60s后过期
  20.         jedis.setex(key,60,value)
  21.         //设置60ms后过期
  22.         jedis.psetex(key,60,value)
  23.         
  24.         //剩余的过期时间,ttl返回时间单位为s,pttl则是ms
  25.         val time = jedis.ttl(key)
  26.         val time = jedis.pttl(key)
  27.     }
  28. }
复制代码
通过setex或psetex方法来设置过期时间后,当数据过期后,再次去查询该数据,就会得到null(即redis将数据删除了)
上述也是简单演示了redis数据库的增删改查功能,下面就利用此数据库来实现发送验证码的功能。
2.发送验证码

这里我是实现了邮箱发送验证码的功能,验证码定为6位纯数字随机数,当然,你也可以加上大小写字母来提高复杂性。
之后我们将邮箱和验证码存储到redis中,并设置十分钟过期时间,随后通过调用邮箱发送邮件的方法,将验证码发送出去(这里详见JavaXMail发送邮件功能实现
下面是验证码生成方法:
[code]//生成验证码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
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表