溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Redis怎么實(shí)現(xiàn)驗(yàn)證碼發(fā)送并限制每日發(fā)送次數(shù)

發(fā)布時(shí)間:2022-04-18 15:23:54 來源:億速云 閱讀:413 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Redis怎么實(shí)現(xiàn)驗(yàn)證碼發(fā)送并限制每日發(fā)送次數(shù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Redis怎么實(shí)現(xiàn)驗(yàn)證碼發(fā)送并限制每日發(fā)送次數(shù)”吧!

1、功能

  • 輸入手機(jī)號(hào),點(diǎn)擊發(fā)送后隨機(jī)生成六位數(shù)字碼,2分鐘有效

  • 輸入驗(yàn)證碼,點(diǎn)擊驗(yàn)證,返回成功或失敗

  • 每個(gè)手機(jī)號(hào)每天只能輸3次

2、分析

  • 每個(gè)手機(jī)每天只能輸3次:incr每次發(fā)送之后+1,當(dāng)值為3時(shí)提示不能發(fā)送,過期時(shí)間為當(dāng)天結(jié)束

  • 隨機(jī)生成6位數(shù)字驗(yàn)證碼:RandomUtil(hutool)

  • 驗(yàn)證碼2分鐘有效:放入redis里并設(shè)置過期時(shí)間2分鐘

  • 判斷驗(yàn)證碼是否一致:從redis里獲取驗(yàn)證碼和輸入的驗(yàn)證碼進(jìn)行比對(duì)

3、實(shí)現(xiàn)

package cn.ken.blog.controller.common;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.ken.blog.common.constant.Constants;
import cn.ken.blog.common.domain.Result;
import cn.ken.blog.common.enums.ErrorCodeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 驗(yàn)證碼控制器
 * @author Ken-Chy129
 * @date 2022/4/17 20:28
 */
@RestController
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public class CaptureController {
    
    @Autowired
    private RedisTemplate redisTemplate;
    
    // 生成驗(yàn)證碼
    @GetMapping("getNumCode")
    public Result<String> getNumCode(String phone) {
        String captureLimitKey = Constants.CAPTCHA_LIMIT_KEY + phone;
        Integer counts = (Integer) redisTemplate.opsForValue().get(captureLimitKey);
        if (ObjectUtils.isEmpty(counts)) {
            // 今天第一次驗(yàn)證,故之前緩存中無該鍵
            // 距離今天結(jié)束剩下多少毫秒
            long expire = DateUtil.endOfDay(new Date()).between(new Date(), DateUnit.MS);
            redisTemplate.opsForValue().set(captureLimitKey, 1, expire, TimeUnit.MILLISECONDS);
        } else if (counts < 3) {
            // 沒有超過限制次數(shù)
            redisTemplate.opsForValue().increment(captureLimitKey);
        } else {
            // 超過限制次數(shù),不生成驗(yàn)證碼,直接返回
            return new Result<String>().error(ErrorCodeEnum.OVER_LIMITS);
        }
        // 生成驗(yàn)證碼
        String code = RandomUtil.randomNumbers(6); // 隨機(jī)生成六位數(shù)
        String captureCodeKey = Constants.CAPTCHA_CODE_KEY + phone;
        redisTemplate.opsForValue().set(captureCodeKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        return new Result<String>().success(captureCodeKey + ":" + code);
    }
    
    // 驗(yàn)證驗(yàn)證碼
    @GetMapping("verify")
    public Result<String> verify(String phone, String code) {
        String captureCodeKey = Constants.CAPTCHA_CODE_KEY + phone;
        String realCode = (String) redisTemplate.opsForValue().get(captureCodeKey);
        if (ObjectUtils.isEmpty(realCode)) {
            // redis中不存在該用戶生成的驗(yàn)證碼,證明驗(yàn)證碼以過期銷毀
            return new Result<String>().error(ErrorCodeEnum.OVERDUE_CODE);
        }
        if (realCode.equals(code)) {
            return new Result<String>().success("驗(yàn)證成功");
        } else {
            return new Result<String>().error(ErrorCodeEnum.ERROR_CODE);
        }
    }
    
//    @Scheduled(cron = "0 0 12 * * ?")
//    private void clear() {
//        redisTemplate.delete()
//    }
}
// Constants類

/**
 * 驗(yàn)證碼 redis key
 */
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";

/**
 * 每日限制 redis key
 */
public static final String CAPTCHA_LIMIT_KEY = "captcha_limits:";
/**
 * 驗(yàn)證碼有效期(分鐘)
 */
public static final Integer CAPTCHA_EXPIRATION = 2;

感謝各位的閱讀,以上就是“Redis怎么實(shí)現(xiàn)驗(yàn)證碼發(fā)送并限制每日發(fā)送次數(shù)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Redis怎么實(shí)現(xiàn)驗(yàn)證碼發(fā)送并限制每日發(fā)送次數(shù)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI