Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能

开篇

现在的网站基本都有邮件注册功能,毕竟可以通过邮件定期的给用户发送一些 垃圾邮件 精选推荐。

回到正题,首先我们得清楚一下几点

  • 邮件注册需要什么信息?

    ​ 最基本的:邮箱地址密码验证码

  • 这些信息放在什么位置?

    ​ 邮箱地址和密码没得说,以后会频繁使用,都得放到 MySQL 中,验证码呢,如果也放到 MySQL 还得给它新建一个字段,但注册后就不用了,这时候,redis 就可以很好的解决这个问题,而且 redis 还可以设置过期时间,各种数据类型也非常方便。

  • 如何发送邮件?

    ​ Spring Boot 整合了 JavaMailSender,导入 jar包即可使用,非常的方便

基本流程

  1. 点击发送邮件,后台生成一个随机验证码存入redis中,设置有效期5分钟
  2. 点击注册,拿用户输入的验证码和redis中的验证码比较是否一致

代码实现

只贴出核心代码,如果需要请前往我的 Github 查看
邮件服务器:邮件服务器地址大全

  1. 导入 Maven 依赖

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
  2. 配置邮件、redis信息

    spring:
    # 配置邮件
    mail:
    host: smtp.qq.com #邮件服务器地址
    username: xxx #发送者邮箱
    password: xxx #密码
    default-encoding: utf-8
    # 配置redis
    redis:
    database: 0
    host: xxx
    port: 6379 # 发送者邮箱
    beetle:
    sender:
    email: xxx
  3. 重新配置RedisTemplate,原生的RedisTemplate存在序列化问题,需要重新指定

    @Configuration
    @AutoConfigureAfter(CommunityApplication.class)
    public class RedisConfig { /**
    * 由于原生的redis自动装配,在存储key和value时,没有设置序列化方式,故自己创建redisTemplate实例
    * @param factory
    * @return
    */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    // key采用String的序列化方式
    template.setKeySerializer(stringRedisSerializer);
    // hash的key也采用String的序列化方式
    template.setHashKeySerializer(stringRedisSerializer);
    // value序列化方式采用jackson
    template.setValueSerializer(jackson2JsonRedisSerializer);
    // hash的value序列化方式采用jackson
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
    }
    }
  4. 写一个发送邮件的方法,到这里,我们已经把验证码生成并存到 redis 中了

    public Boolean sendEmail(String email) {
    if(!registered(email)){
    SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    simpleMailMessage.setTo(email);
    simpleMailMessage.setSubject("测试");
    //生成6位随机数
    int code = (int) ((Math.random() * 9 + 1) * 100000);
    //存入redis,过期时间5分钟
    redisTemplate.opsForValue().set(CODE_PRE + email, code, 5, TimeUnit.MINUTES);
    simpleMailMessage.setText("这是一封测试邮件,验证码:" + code);
    simpleMailMessage.setFrom(senderEmail);
    try {
    mailSender.send(simpleMailMessage);
    return true;
    } catch (MailException e) {
    log.error("邮件发送出错,{}", e);
    }
    }
    return false;
    }
  5. 注册的时候,需要先检查用户输入的验证码和 redis 中的是否一致,注册的其他逻辑我就不贴出来了

    public boolean checkCode(String email, Integer code) {
    Integer redisCode = (Integer) redisTemplate.opsForValue().get(CODE_PRE + email);
    return redisCode != null && redisCode.equals(code);
    }

效果演示

以我最近做的一个项目为例进行展示,源码:甲壳虫社区源码,线上地址:甲壳虫社区

  • 注册界面

  • redis 数据

  • 收到邮件

Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能的更多相关文章

  1. SpringBoot入门系列(七)Spring Boot整合Redis缓存

    前面介绍了Spring Boot 中的整合Mybatis并实现增删改查,.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/ ...

  2. (转)spring boot整合redis

    一篇写的更清晰的文章,包括redis序列化:http://makaidong.com/ncjava/330749_5285125.html 1.项目目录结构 2.引入所需jar包 <!-- Sp ...

  3. Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

    在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...

  4. Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!   『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』   本文提纲 ...

  5. spring boot整合redis,以及设置缓存过期时间

    spring-boot 整合 redis 注:redis服务器要先开启 pom文件: <dependency> <groupId>org.springframework.boo ...

  6. spring boot 2.x 系列 —— spring boot 整合 redis

    文章目录 一.说明 1.1 项目结构 1.2 项目主要依赖 二.整合 Redis 2.1 在application.yml 中配置redis数据源 2.2 封装redis基本操作 2.3 redisT ...

  7. Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

    经过 Spring Boot 的整合封装与自动化配置,在 Spring Boot 中整合Redis 已经变得非常容易了,开发者只需要引入 Spring Data Redis 依赖,然后简单配下 red ...

  8. Spring Boot 整合Redis 实现缓存

      本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解   ...

  9. spring boot 整合 redis

    自己开发环境需要安装 redis 服务,百度一下很多,下面主要说明Springboot 集成 redis 讲解 我的版本 java8 + redis3.0 + springboot 1.5.9. Sp ...

随机推荐

  1. Web自动化测试平台设计与落地-概览

    引言 自动化金字塔-灵魂手绘版 关于Web自动化测试,投入产出比是一个绕不开的话题,对于走到2017年的测试人,这时候可能已经有很多人会想到著名的自动化测试金字塔.它形象地展示了Mike Cohn对自 ...

  2. MySQL5.7彻底取消主从复制

    由于手误在master节点执行了stop slave;->change master to XXX;->start slave;的动作,后面虽然使用stop slave停止了主从复制,但是 ...

  3. LLDB奇巧淫技

    打印视图层级 这个相信很多人都会了,是ta是ta就是ta recursiveDescription 用法大概就是如下 123 po [self.view recursiveDescription] p ...

  4. [Golang]字符串拼接方式的性能分析

    本文100%由本人(Haoxiang Ma)原创,如需转载请注明出处. 本文写于2019/02/16,基于Go 1.11.至于其他版本的Go SDK,如有出入请自行查阅其他资料. Overview 写 ...

  5. Soulwail

    XMLHttpRequest 属性解读 首先在 Chrome console 下创建一个 XMLHttpRequest 实例对象 xhr.如下所示: inherit 试运行一下代码. var xhr ...

  6. JavaScript是如何工作的(一)

    简评:JavaScript 是越来越受欢迎了,很多团队都在采用这些语言工作.前端.后端.嵌入式设备等等,都可以看见它的身影.虽然我们知其然,但又知其所以然吗? 大家应该都知道 JavaScript 是 ...

  7. Kubernetes搭建过程中使用k8s.gcr.io、quay.io、docker.io的镜像加速

    前言 因为众所周知的原因,在使用Kubernetes和docker的时候会出现一些镜像无法拉取或者速度较慢的情况,错误信息类似以下: [ERROR ImagePull]: failed to pull ...

  8. GDB调试系列之了解GDB

    想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...

  9. 使用Taiko + Gauge进行自动化测试(一)

    目录 初识Taiko 环境安装 尝试Taiko taiko 执行过程 结合Gauge编写用例 使用Gauge 总结 初识Taiko 先来了解一下什么是Taiko:"Taiko是一个免费的开源 ...

  10. kali linux下运行.sh文件权限不够解决办法

    我要装一个生成免杀的神奇,系统提示权限不够 2 于是我想到了sudo,可还是不行 3 于是找到了方法 chmod   a+x   文件名 4 再运行一下,成功 5 有时有的方法很简答,只要你愿意找.