最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis實現(xiàn)驗證碼發(fā)送并限制每日發(fā)送次數(shù)的示例代碼

 更新時間:2022年04月18日 12:29:56   作者:得過且過的勇者y  
本文主要介紹了Redis實現(xiàn)驗證碼發(fā)送并限制每日發(fā)送次數(shù)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、功能

  • 輸入手機號,點擊發(fā)送后隨機生成六位數(shù)字碼,2分鐘有效
  • 輸入驗證碼,點擊驗證,返回成功或失敗
  • 每個手機號每天只能輸3次

2、分析

  • 每個手機每天只能輸3次:incr每次發(fā)送之后+1,當(dāng)值為3時提示不能發(fā)送,過期時間為當(dāng)天結(jié)束
  • 隨機生成6位數(shù)字驗證碼:RandomUtil(hutool)
  • 驗證碼2分鐘有效:放入redis里并設(shè)置過期時間2分鐘
  • 判斷驗證碼是否一致:從redis里獲取驗證碼和輸入的驗證碼進行比對

3、實現(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;

/**
?* 驗證碼控制器
?* @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)) {
? ? ? ? ? ? // 今天第一次驗證,故之前緩存中無該鍵
? ? ? ? ? ? // 距離今天結(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ù),不生成驗證碼,直接返回
? ? ? ? ? ? return new Result<String>().error(ErrorCodeEnum.OVER_LIMITS);
? ? ? ? }
? ? ? ? // 生成驗證碼
? ? ? ? String code = RandomUtil.randomNumbers(6); // 隨機生成六位數(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);
? ? }
? ??
? ? // 驗證驗證碼
? ? @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;

到此這篇關(guān)于Redis實現(xiàn)驗證碼發(fā)送并限制每日發(fā)送次數(shù)的示例代碼的文章就介紹到這了,更多相關(guān)Redis驗證碼發(fā)送并限制次數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Redis?lua實現(xiàn)高效讀寫鎖的代碼實例

    利用Redis?lua實現(xiàn)高效讀寫鎖的代碼實例

    這篇文章給大家介紹了如何利用Redis?lua實現(xiàn)高效的讀寫鎖,讀寫鎖的好處就是能幫助客戶讀到的數(shù)據(jù)一定是最新的,寫鎖是排他鎖,而讀鎖是一個共享鎖,需要的朋友可以參考下
    2024-01-01
  • 詳解redis-cli?命令

    詳解redis-cli?命令

    這篇文章主要介紹了redis-cli?命令詳解,主要包括命令使用及使用info命令獲取服務(wù)器的信息,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • redis的hash類型操作方法

    redis的hash類型操作方法

    Hash 是一個 String 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲對象,這篇文章主要介紹了redis的hash類型的詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Redis 緩存問題及解決

    Redis 緩存問題及解決

    網(wǎng)上收集的一些經(jīng)典特效,這里因為篇幅較長,不加整理了,想運行的代碼的朋友可以點擊textarea中,全選復(fù)制即可。
    2010-07-07
  • Redis如何實現(xiàn)計數(shù)統(tǒng)計

    Redis如何實現(xiàn)計數(shù)統(tǒng)計

    這篇文章主要介紹了Redis如何實現(xiàn)計數(shù)統(tǒng)計方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis在windows環(huán)境下如何啟動

    Redis在windows環(huán)境下如何啟動

    這篇文章主要介紹了Redis在windows環(huán)境下如何啟動的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis緩存鍵清理問題解決

    Redis緩存鍵清理問題解決

    對于使用redis作為緩存服務(wù)器的開發(fā)者而言,定期清除redis中的緩存數(shù)據(jù)是非常必要的,本文主要介紹了Redis緩存鍵清理問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • 關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)詳解

    關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)詳解

    Redis是一種高級key-value數(shù)據(jù)庫。它跟memcached類似,不過數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類型很豐富。有字符串,鏈表、哈希、集合和有序集合5種。下面這篇文章主要給大家介紹了關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • 64位Windows下安裝Redis教程

    64位Windows下安裝Redis教程

    這篇文章主要介紹了64位Windows下安裝Redis教程,本文使用Microsoft Open Tech group 在 GitHub上開發(fā)的一個Win64版本的Redis,需要的朋友可以參考下
    2014-09-09
  • 淺談一下Redis的緩存穿透、擊穿和雪崩

    淺談一下Redis的緩存穿透、擊穿和雪崩

    這篇文章主要介紹了淺談一下Redis緩存穿透、擊穿和雪崩,緩存穿透是指在使用緩存系統(tǒng)時,頻繁查詢一個不存在于緩存中的數(shù)據(jù),導(dǎo)致這個查詢每次都要通過緩存層去查詢數(shù)據(jù)源,無法從緩存中獲得結(jié)果,需要的朋友可以參考下
    2023-08-08

最新評論

衡阳县| 梁平县| 泾川县| 四会市| 福建省| 贵州省| 古田县| 梁平县| 邓州市| 嘉鱼县| 新建县| 象山县| 五河县| 文成县| 磴口县| 航空| 探索| 修文县| 佳木斯市| 来安县| 葵青区| 思茅市| 铜梁县| 土默特右旗| 斗六市| 青川县| 阳信县| 泰顺县| 德江县| 汪清县| 来凤县| 临夏市| 三门县| 太保市| 凌海市| 阿勒泰市| 驻马店市| 石河子市| 当阳市| 彩票| 淮安市|