说明
邮箱验证码我们其实在手机验证码还没有普及的时候很常见,笔者是做一个小需求 并没有需要用到手机号去验证,
其实不论是邮箱验证还是手机验证,他们的流程都是差不多的,只是手机号验证需要办理运营商套餐,而邮箱验证
开启邮箱的pop3协议就可以了。
大致流程其实就这几步
- 使用随机函数生成四位随机数存入redis中,邮箱为key,随机数为value,存活时长三分钟
- 把随机数通过邮件发送给用户,这个过程最好是异步的,因为邮件的发送也要十来秒
- 如果用户在三分钟内仍请求发送验证码,检测redis的key中有无该邮箱,如果没有则重新发送,有该邮箱key则不发送
1.首先配置redis,笔者使用RedisTemplate
redisTemplate其实是集成Jedis的redis操作模板,使用起来非常简单。
需要了解其在springboot工程中怎么配置,和其详细的用法,
可以查看笔者的上一篇博客,springboot配置stringRedisTemplate
2.用户注册和找回密码都是通过邮箱来实现的
springboot集成的框架简直多得不要不要的,邮件发送配置一个mail得starter即可,不过需要配置详细得发送人抄送等信息,
配置邮箱和mail的starter发送邮件,可以查看笔者的上一篇博客:SpringBoot使用JavaMailSender发送邮件
3.使用随机数生成四位随机数,当作验证码,并且设置失效时间为三分钟,
String emailReg = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
Pattern pattern = Pattern.compile(emailReg);
Matcher matcher = pattern.matcher(email);
if(matcher.find()){ //验证邮箱格式是否正确
String code = String.valueOf((int)((Math.random()*9+1)*1000)); //四位随机数验证码
//向redis里存入数据和设置缓存时间
redisTemplate.opsForValue().set(email, code, 60 * 3, TimeUnit.SECONDS);
try {
emailService.sendEmail("123456***@163.com",email,"验证码",code);
data.put("code","success");
data.put("msg","验证码发送成功,三分钟有效,请注意查收!");
} catch (Exception e) {
e.printStackTrace();
data.put("code","error");
data.put("msg","无法发送邮件,请稍后重试!");
}
}else {
data.put("code","error");
data.put("msg","邮箱格式不正确!");
}