java接口防刷机制

目录

1. 问题

2. 代码


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);

猜你喜欢

转载自blog.csdn.net/Hubery_sky/article/details/131853337