您好,登錄后才能下訂單哦!
這篇文章主要講解了“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ù)”吧!
輸入手機(jī)號(hào),點(diǎn)擊發(fā)送后隨機(jī)生成六位數(shù)字碼,2分鐘有效
輸入驗(yàn)證碼,點(diǎn)擊驗(yàn)證,返回成功或失敗
每個(gè)手機(jī)號(hào)每天只能輸3次
每個(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ì)
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)注!
免責(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)容。