91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis怎么實現驗證碼發送并限制每日發送次數

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

這篇文章主要講解了“Redis怎么實現驗證碼發送并限制每日發送次數”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Redis怎么實現驗證碼發送并限制每日發送次數”吧!

1、功能

  • 輸入手機號,點擊發送后隨機生成六位數字碼,2分鐘有效

  • 輸入驗證碼,點擊驗證,返回成功或失敗

  • 每個手機號每天只能輸3次

2、分析

  • 每個手機每天只能輸3次:incr每次發送之后+1,當值為3時提示不能發送,過期時間為當天結束

  • 隨機生成6位數字驗證碼:RandomUtil(hutool)

  • 驗證碼2分鐘有效:放入redis里并設置過期時間2分鐘

  • 判斷驗證碼是否一致:從redis里獲取驗證碼和輸入的驗證碼進行比對

3、實現

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;

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

/**
 * 驗證碼 redis key
 */
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";

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

感謝各位的閱讀,以上就是“Redis怎么實現驗證碼發送并限制每日發送次數”的內容了,經過本文的學習后,相信大家對Redis怎么實現驗證碼發送并限制每日發送次數這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸西县| 尼勒克县| 西和县| 临城县| 武鸣县| 阿瓦提县| 谢通门县| 北辰区| 确山县| 徐闻县| 喜德县| 上杭县| 固始县| 翼城县| 米泉市| 青川县| 河西区| 乐业县| 延庆县| 永新县| 麟游县| 东辽县| 潍坊市| 施甸县| 嘉善县| 威远县| 壤塘县| 临猗县| 苏尼特右旗| 无为县| 瑞昌市| 上栗县| 绥棱县| 清水县| 高要市| 诸城市| 富民县| 蓬莱市| 邳州市| 黄大仙区| 沁阳市|