短信验证码防刷复习(放松一下)

场景

登录页面,输入手机号,获取到验证码后,再次刷新页面,继续输入手机号,仍旧获取到验证码

解决

redis 的value不仅存储 验证码,同时存储当前时间,下次进来判断是否为60s内的请求

@ResponseBody
@GetMapping("/sms/sendcode")
public R sendCode(@RequestParam("phone") String phone) {
    String code = UUID.randomUUID().toString().substring(0, 5);
    String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);
    if (!StringUtils.isEmpty(redisCode)) {// 第一次发送,缓存里面是没有的,需要非空判断
        long l = Long.parseLong(redisCode.split("_")[1]);
        // 当前时间 - 生成code的时间 < 60s [注意:这里时间是毫秒值]   防止同一个phone在60秒内再次发送验证码
        if (System.currentTimeMillis() - l < 60000) {
		return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(), BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());
        }
    }
    // 验证码的再次校验。存key-phone,value-code   sms:code:手机号码 code  [注意:这里要有过期时间]
    stringRedisTemplate.opsForValue().set(
        AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone, 
        code + "_" + System.currentTimeMillis(), 
        10, TimeUnit.MINUTES);

    // 第三方短信发送接口
    thirdPartyFeignService.sendCode(phone, code);
    return R.ok();
}

你可能感兴趣的:(java,redis)