雁过留声 发表于 2023-4-4 14:11:25

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

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

1.引入依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>脚本使用:
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=value
      //读数据
      val result = jedis
      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 ?: ""    }    /**   * 存储邮箱和验证码   */    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
页: [1]
查看完整版本: Java/Kotlin 使用Redis模拟发送验证码