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. 关于(Building tool)的认识以及当下流行的Building tool有哪些?

    1.Building tool是什么? (Building tool)构建工具是一种工具,它负责构建流程的所有内容,并自动化与构建项目相关的所有内容.它致力于以下任务: 生成源代码(如果在软件项目中使 ...

  2. 为啥java要使用 set ()和get()方法---封装

    封装性:属性封装,方法封装,类封装,组件封装等 例如:如果属性没有封装,那么在本类对象之外创建对象后,可以直接访问属性 private关键字,只能在本类中访问,想要在外部访问私有属性,我们需要提供公有 ...

  3. 如何用js判断一个对象是不是Array

    .如何用js判断一个对象是不是Array 1.Array.isArray(obj) 调用数组的isArray方法 2.obj instanceof Array 判断对象是否是Array的实例 3.Ob ...

  4. SpringMVC之@SessionAttribute和@ModelAttribute

    1.Controller package com.tz.controller; import java.util.Map; import org.springframework.stereotype. ...

  5. SpringMVC之添加照片并修改照片名字

    @RequestMapping(value="/addIdcardsSubmit",method={RequestMethod.POST,RequestMethod.GET}) p ...

  6. 一个自动递增生成目录和文件的cop文件类

    package com.hudong.util.orther; import java.io.File; import java.io.FileInputStream; import java.io. ...

  7. git push 时不用每次都输入密码的方法

    在本地克隆下来的git仓库中找到 .git 目录 (.git 目录是隐藏文件夹 在组织->文件夹和搜索选项-> 查看选项卡 -> 隐藏文件和文件夹 -> 显示隐藏的文件.文件夹 ...

  8. 码海拾遗:简单Socket(TCP)类实现

    最近刚开始啃Unix网络编程(卷1:套接字联网API),为加深TCP连接的建立和终止的理解与记忆,记下本文,方便以后翻看. 同时留下的还有简单的Socket(TCP)类: mySocket.h #pr ...

  9. 新浪微博PC端登录分析

    本来给自己定了个2018的目标,平均每月写两篇文章,现在已经快三月了,第一篇稿子才憋出来,惭愧呀,直入主题吧,今天给大家带来的是新浪微博PC端的模拟登陆. 工具 这次使用的工具是Charles和chr ...

  10. python爬虫-纠正MD5错误认知

    m = md5(".encode()) print(m.hexdigest()) # 25d55ad283aa400af464c76d713c07ad m = md5(".enco ...