Heim  >  Artikel  >  Datenbank  >  Wie implementiert Redis das Senden von Bestätigungscodes und begrenzt die Anzahl der täglichen Sendungen?

Wie implementiert Redis das Senden von Bestätigungscodes und begrenzt die Anzahl der täglichen Sendungen?

WBOY
WBOYnach vorne
2023-05-27 12:55:111808Durchsuche

1. Funktion

  • Geben Sie Ihre Mobiltelefonnummer ein und klicken Sie auf Senden, um einen sechsstelligen Code zu generieren, der 2 Minuten lang gültig ist

    #🎜 🎜##🎜 🎜#
  • Geben Sie den Bestätigungscode ein, klicken Sie auf „Verifizieren“, geben Sie Erfolg oder Misserfolg zurück
  • Jede Mobiltelefonnummer kann nur dreimal täglich eingegeben werden
  • #🎜🎜 #

    2. Analyse

Jedes Mobiltelefon kann nur 3 Mal am Tag verlieren: +1 danach bei jedem Senden, wenn der Wert 3 ist. Die Eingabeaufforderung kann nicht gesendet werden und die Ablaufzeit ist das Ende des Tages
  • Generieren Sie zufällig einen 6-stelligen Bestätigungscode: RandomUtil (hutool)
  • Der Bestätigungscode ist 2 Minuten lang gültig: Geben Sie ihn in Redis ein und stellen Sie die Ablaufzeit auf 2 Minuten ein
  • #🎜 🎜#

    Bestimmen Sie, ob der Bestätigungscode konsistent ist: Holen Sie sich den Bestätigungscode und geben Sie ihn von Redis ein. Vergleichen Sie die Bestätigungscodes

  • 3. Implementieren Sie

    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;

Das obige ist der detaillierte Inhalt vonWie implementiert Redis das Senden von Bestätigungscodes und begrenzt die Anzahl der täglichen Sendungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen