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. Vuex安装使用

    vuex是以插件的方式存在的. 安装:打开项目的根目录,即package.json所在目录,执行以下命令: npm install vuex --save-dev 背景:小型应用里的每个组件维护着自有 ...

  2. Spring History和spring设计哲学

    1.spring history spring起点 2002年10月,Rod Johnson 写了一本名为Expert One-on-One J2EE设计和开发的书.本书由Wrox发布,涵盖了当时Ja ...

  3. JSF技术web.xml配置解析

    对Java tutorial-examples中jsf hell1的web.xml配置文件的解析 <?xml version="1.0" encoding="UTF ...

  4. TCPCopy 线上流量复制工具

    TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序. 一.描述: 虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试 ...

  5. yii批量数据插入

    yii框架批量插入数据有两种方法,第一种是循环多次插入和一次批量插入,第一种方法要注意插入数据中间有一次数据插入失败要注意回滚事务 循环插入数据 第一种方法 $model = new User(); ...

  6. bzoj1603: [Usaco2008 Oct]打谷机 (纱布题)

    Description Input Output Sample Input Sample Output Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 7 ...

  7. 开发过程中关于JSON的那些事

    在使用过程中,对JSON了解的还不够,特地整理一下,用于个人学习和知识参考. 1.IBM的json入门指南    json官网 2.javaweb中发送接收解析问题 3.Java解析json,以及js ...

  8. 代码演示C#各版本新功能

    代码演示C#各版本新功能 C#各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过非常简短的代码将每个新特性演示出来. 代码演示C#各版本新功能 C# 2.0版 - 2005 泛型 分部类型 ...

  9. R语言入门级实例——用igragh包分析社群

    R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...

  10. Wireshark网络分析就这么简单——读书笔记

    前言 什么是wireshark? wireshark可能是世界上最好的开源网络分析器,能在多个平台上(Linux.Mac和Windows)抓取和分析网络包 wireshark分析常见的协议,可以在学习 ...