1. 程式人生 > 其它 >驗證碼5分鐘有效,60秒不重複傳送

驗證碼5分鐘有效,60秒不重複傳送

1.1application.yml新增連線redis的配置

  # Redis
redis:
  host: localhost
  port: 6379
  password: #密碼(沒有密碼可以不設定)
  database: 0 #連線0庫
  timeout: 0 #連線超時時間(毫秒)
  # 對應 RedisProperties.Jedis 內部類
  jedis:
    pool:
      max-active: 8 # 連線池最大連線數,預設為 8 。使用負數表示沒有限制。
      max-idle: 8 # 預設連線數最小空閒的連線數,預設為 8 。使用負數表示沒有限制。
      min
-idle: 0 # 預設連線池最小空閒的連線數,預設為 0 。允許設定 0 和 正數。 max-wait: -1 # 連線池最大阻塞等待時間,單位:毫秒。預設為 -1 ,表示不限制。

1.2在pet-service新建連線第三方介面redis的RedisService

package cn.pet.service.thirdparty.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component public class RedisService { private static final Logger logger= LoggerFactory.getLogger(RedisService.class
); @Autowired private StringRedisTemplate stringRedisTemplate; //定義方法,向redis存資料 public void setValue(String key,String value){ try{ ValueOperations<String, String> vo = stringRedisTemplate.opsForValue(); vo.set(key,value); logger.info("set redis success key={},value={}",key,value); }catch (Exception e){ logger.info("set redis fail e={}",e); } } //定義方法,向redis存資料,設定有效時間 public void setValue(String key,String value,long time){ try{ ValueOperations<String, String> vo = stringRedisTemplate.opsForValue(); //redis中time有效時間,使用秒錶示 vo.set(key,value,time, TimeUnit.SECONDS); logger.info("set redis success key={},value={},time={}",key,value,time); }catch (Exception e){ logger.info("set redis fail e={}",e); } } //定義方法,獲取有限時間 public Long getTime(String key){ try{ Long time = stringRedisTemplate.getExpire(key); logger.info("有效時間為{},:",time); return time; }catch (Exception e){ logger.info("沒有有限時間"); return null; } } }

1.3在pet-service的UmsSmsServiceImpl傳送驗證碼成功的地方把驗證碼存入redis,設定有效時間

@Service
@Transactional
public class UmsSmsServiceImpl implements UmsSmsService {
    private static final Logger logger= LoggerFactory.getLogger(AliYunService.class);
    @Autowired
    private AliYunService aliYunService;
    @Autowired
    private RedisService redisService;
    @Override
    public Boolean sendSms(String phone, Integer codeType) {
        //需要生成驗證碼
        String code = MathUtils.random();
        logger.info("手機號碼:{} 簡訊驗證碼為:{}",phone,code);
        String result = aliYunService.sendSms(phone, code);
        if (result.equals(Constants.Sms.ALI_SMS_RESULT)){
            //簡訊驗證碼傳送成功
            //驗證碼存入redis
            //通過工具shengchengkey
            String key = UmsUtils.generateSmsRedisKey(codeType.toString(), phone);
            redisService.setValue(key,code,Constants.Time.ALI_SMS_EFFECTIVE_TIME);
            return true;
        }
        return false;
    }
}

 

1.4在pet-web的UmsSmsController中新增驗證碼60s不重複傳送

package cn.pet.controller;

import cn.pet.constant.Constants;
import cn.pet.result.Result;
import cn.pet.result.ResultEnum;
import cn.pet.result.ResultUtils;
import cn.pet.service.UmsSmsService;
import cn.pet.service.thirdparty.redis.RedisService;
import cn.pet.utils.UmsUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/api/ums/sms")
@RestController
public class UmsSmsController {

    private static final Logger logger= LoggerFactory.getLogger(UmsSmsController.class);
    @Autowired
    private UmsSmsService umsSmsService;
    @Autowired
    private RedisService redisService;
    @PostMapping("/sendSms")
    public Result sendSms(String phone,Integer codeType){
        //判斷手機號
        if (StringUtils.isEmpty(phone) | !UmsUtils.checkPhone(phone)){
            return ResultUtils.returnResult(ResultEnum.FAIL_UMS_PHONE_ERROR);
        }

        if (!UmsUtils.checkCodeType(codeType)){
            return ResultUtils.returnResult(ResultEnum.FAIL_UMS_SMS_CODE_TYPE_ERROR);
        }

        //判斷驗證碼在redis中存放夠不夠一分鐘  不夠一分鐘,不能呼叫sendSms,如果超過一分鐘呼叫sendSms
        if (checkIsExpire(codeType,phone)){
            logger.info("不能頻繁傳送驗證碼");
            return ResultUtils.returnFail("一分鐘之內不能重複傳送驗證碼");
        }
        
        //呼叫service介面
        Boolean aBoolean = umsSmsService.sendSms(phone, codeType);
        if (aBoolean){
            return ResultUtils.returnSuccess();
        }else {
            return ResultUtils.returnFail();
        }
    }

    private Boolean checkIsExpire(Integer codeType,String phone){
        //從redis中獲取有效時間  通過key
        String key = UmsUtils.generateSmsRedisKey(codeType.toString(), phone);
        Long time = redisService.getTime(key);

        if (time> Constants.Time.ALI_SMS_CHECK_TIME){
            //表示驗證碼在redis存放不到一分鐘
            return true;
        }
        return false;

    }
}