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