SpringBoot邮箱集成服务(三)----------邮箱验证用法(后端)

如果喜欢我的编程笔记可以关注我的微信公众号【Java掌上手册】,上面有我不定期的项目面试题分享哦~(关注公众号回复面试宝典便可获得史上最全的后端面试题资料哦!)

1.Controller层编写接口
利用@RequestParam注解来获取前端给后端发的email(要发送验证信息的邮箱)和type(种类)并调用userService中创建的sendEmail方法将两个参数注入

/**
* 邮箱验证接口
* @param email
* @param type
* @return
*/
//@RequestParam:?email=xxx&type=xxx
@ApiOperation("邮箱验证接口")
    @GetMapping("/email")
    public Result sendEmail(@RequestParam String email,@RequestParam String type){
    userService.sendEmail(email,type);
    return Result.success();
}

2.Service层接口

void sendEmail(String email, String type);

3.ServiceImpl实现接口编写邮箱发送验证码的逻辑,也就是sendEmail()方法,并将信息存入hashMap集合(缓存)中

 //key是code,value为当前的时间戳
    private static final Map<String,Long> CODE_MAP = new ConcurrentHashMap<>();

    @Autowired
    private EmailUtils emailUtils;


/**
* 邮箱验证逻辑
* @param email
* @param type
*/
@Override
    public void sendEmail(String email, String type) {
    String code = RandomUtil.randomNumbers(6);
    log.info("本次验证的code为:"+code);
    String context = "<b>尊敬的用户:</b><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您好," +
        "xxxx提醒您本次的验证码是:<b>{}</b>," +
        "有效期5分钟。<br><br><br><br><br><br><br><b>xxxx欢迎您的注册~</b>";
    String html = StrUtil.format(context, code);
    if ("REGISTER".equals(type)){//注册
          //校验邮箱是否已经注册
            QueryWrapper<User> queryWrapper = new QueryWrapper<User>().eq("email",email);
            User user = getOne(queryWrapper);
            if (user != null){
                throw new ServiceException("此邮箱已被注册");
            }
        ThreadUtil.execAsync(()->{  //多线程执行异步请求,可以防止网络阻塞
            emailUtils.sendHtml("xxxx邮箱注册验证码",html,email);
        });
        CODE_MAP.put(code,System.currentTimeMillis());
    }
}

4.ServiceImpl中封装校验验证码的逻辑
首先传参网页上输入的验证码作为key在hashMap(缓存)中获取

  //key是code,value为当前的时间戳
    private static final Map<String,Long> CODE_MAP = new ConcurrentHashMap<>();
    private static final long TIME_IN_MS5 = 5 * 60 * 1000; //表示5分钟的毫秒数

/**
* 校验邮箱的封装方法
* @param emailCode
*/
private void validateEmail(String emailCode){
    //校验邮箱
    Long timestamp = CODE_MAP.get(emailCode);
if (timestamp == null){
    throw new ServiceException("请先验证邮箱或验证码不正确");
}
if (timestamp + TIME_IN_MS5 < System.currentTimeMillis()){//说明验证码过期了
    throw new ServiceException("验证码过期");
}
CODE_MAP.remove(emailCode); //验证完之后清楚缓存
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.SuperHero.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值