1. 问题

我们都知道,手机验证码的发送是需要小钱钱的,但是如果有人恶意在短时间内刷你的手机验证码发送的接口,那就更需要小钱钱了,如果是使用qq邮箱进行发送验证码,那么在短时间内多次进行请求qq也是会禁止你继续发送的,所以为了解决这个问题,于是就有了这篇博客。


栗子:csdn的登陆有验证码防刷,其他的博客网站我也看了一下,也有没有的。


2. 代码

全部逻辑代码:


具体其他的相关代码可以参考:redis整合通过QQ邮箱发送验证码_雾喔的博客-CSDN博客


   //发送邮件

   @PostMapping("/email")

   public R sendEmail(@RequestParam("toMail") String toMail) {

       if (!StringUtils.isEmpty(toMail) & toMail != null) {

           String redisCode = (String) redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + toMail);

           if (!StringUtils.isEmpty(redisCode)) {

               long time = Long.parseLong(redisCode.split("_")[1]);

               if (System.currentTimeMillis() - time < 60000) {

                   //60秒内不能再发

                   return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(), BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());

               }

           }

           String code = YangUtils.getCode();

           //2.验证码有效时间

           //String code1 = UUID.randomUUID().toString().substring(0, 5)+"_"+System.currentTimeMillis();

           String code2 = code + "_" + System.currentTimeMillis();

           //redis缓存验证码

           redisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + toMail, code2, 10, TimeUnit.MINUTES);

           SimpleMailMessage massage = new SimpleMailMessage();

           massage.setFrom(mailUsername);

           massage.setTo(toMail);

           massage.setSubject("Alice小姐为你服务,请收好你的验证码并及时去指定地方兑换奖品哦----");

           massage.setText(code);//发送内容为验证码

           mailSender.send(massage);

           return R.ok("发送成功!");

       }else {

           return R.error(BizCodeEnume.PHONE_NULL_EXCEPTION.getCode(),BizCodeEnume.PHONE_NULL_EXCEPTION.getMsg());

       }

   }


其主要逻辑为,将验证码和邮箱号储存到redis中,之后再继续调用此接口时会先判断是否为同一个邮箱号在60秒内继续调用此接口。


如下:


           String redisCode = (String) redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + toMail);

           if (!StringUtils.isEmpty(redisCode)) {

               long time = Long.parseLong(redisCode.split("_")[1]);

               if (System.currentTimeMillis() - time < 60000) {

                   //60秒内不能再发

                   return R.error(BizCodeEnume.SMS_CODE_EXCEPTION.getCode(), BizCodeEnume.SMS_CODE_EXCEPTION.getMsg());

               }

           }

           String code = YangUtils.getCode();

           //2.验证码有效时间

           //String code1 = UUID.randomUUID().toString().substring(0, 5)+"_"+System.currentTimeMillis();

           String code2 = code + "_" + System.currentTimeMillis();

           //redis缓存验证码

           redisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX + toMail, code2, 10, TimeUnit.MINUTES);