Spring Boot邮箱链接注册验证及注册流程

简单介绍

注册流程
【1】前端提交注册信息
【2】后端接受数据
【3】后端生成一个UUID做为token,将token作为redis的key值,用户数据作为redis的value值,并设置key的时长
【4】后端根据用户信息中的邮箱地址信息,检验用户是否已经注册,如果没有,生成注册链接发送到用户邮箱,如果已经注册,提示用户该邮箱地址已被注册
【5】用户点击邮件中的注册链接
【6】后端判断redis中token是否过期,没有将用户信息保存到数据库,提示用户注册成功
项目源码:https://gitee.com/residual-temperature/email-link-demo.git
邮箱效果图

实现过程

1、pom文件要加入的jar包

   <!-- 邮件相关 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-mail</artifactId>
       </dependency>

       <!-- redis相关 -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-redis</artifactId>
       </dependency>

2、application.yml文件中要加入的配置

spring:
  redis:
    host:     # redis地址
    port: 6379   # redis端口号(默认6379)
    password:     # redis密码
  mail:
    host: smtp.qq.com    # 邮箱协议
    username: 地址          # 发送的邮箱地址
    password:  授权码      # 邮箱的授权码

3、定义实体类

@Repository
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
  private long id;
  private String account;
  private String password;
  private String username;

}

注意

此处没有get(),set()方法是因为导入了lombok包

4、redis的config配置
对象的保存需要序列化,所以需要自定义RedisTemplete

@Configuration
public class RedisConfig {
    //编写自己的配置类
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //为了开发方便一般使用<String,Object>
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        //JSON序列化的配置
        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);
        //String的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);

        //hash采用String的序列方式
        template.setHashKeySerializer(stringRedisSerializer);

        //value序列化采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);

        //hash的Value序列化采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

5、验证链接生成和邮箱发送的工具类CodeUtils的配置

@Component
public class CodeUtils {

    @Resource
    JavaMailSender mailSender;

    @Resource
    RedisTemplate<String, User> redisTemplate;

    // 生成链接,并给接收的邮箱发送邮件
    public boolean sendCode(User user){
        MimeMessage message = mailSender.createMimeMessage();
        try{
            MimeMessageHelper messageHelper = new MimeMessageHelper(message);
            String token = UUID.randomUUID().toString(); // 生成UUID
            redisTemplate.opsForValue().set(token,user);
            redisTemplate.expire(token,300, TimeUnit.SECONDS);
            messageHelper.setFrom("发送方的邮箱地址"); //发送方的邮箱地址,而不是接收方的邮箱地址
            messageHelper.setTo(user.getAddress()); // 接收方的邮箱地址
            messageHelper.setSubject("注册");  // 邮箱标题
            String html = "<html>\n" +
                    "<body>\n" +
                    "<p>请点击下方链接注册</p>\n" +
                    "<a href=\"http://localhost:8081/lookCode/"+token+"\">http://localhost:8081/lookCode/"+token+"</a>" +
                    "</body>\n" +
                    "</html>";
            messageHelper.setText(html,true); // 邮箱内容
            mailSender.send(message);  // 发送邮箱
            System.out.println("发送成功");
            return true;
        }catch (Exception e){
            System.out.println("发送失败");
            return false;
        }
    }

    // 判断token是否过期
    public boolean eqToken(String token){
        return redisTemplate.hasKey(token);
    }

    // 根据token查询用户的信息
    public User findUser(String token){
        return redisTemplate.opsForValue().get(token);
    }

}

6、UserMapper的配置

@Mapper
@Repository
public interface UserMapper {

    // 添加用户 注解开发sql语句
    @Insert("insert into user(account,password,username) values (#{account},#{password},#{username})")
    public int addUser(User user);

}

7、UserService的配置

public interface UserService {

    // 添加用户
    public boolean adduser(User user);

    // 根据用户注册信息进行注册链接的的生成和发送
    public boolean sendCode(User user);

    // 用户点击注册链接判断token是否过期
    public boolean eqToken(String token);

}

8、UserService的实现类UserServiceImpl的配置

@Service
public class UserServiceImpl implements UserService {

    @Resource
    UserMapper userMapper;

    @Resource
    CodeUtils codeUtils;

    /**
     * 添加注册的用户信息
     * @param user 注册的用户信息
     * @return 是否添加成功
     */
    @Override
    public boolean adduser(User user) {
        return userMapper.addUser(user) > 0;
    }

    /**
     * 生成链接和发送链接
     * @param address 接收的邮箱地址
     * @param user 注册的用户信息
     */
    @Override
    public boolean sendCode(User user) {
       if ( codeUtils.sendCode(user)) // 调用验证链接生成工具类中的生成链接和发送邮件函数
           return true;
       else
           return false;
    }

    /**
     * 判断token是否过期
     * @param token 用户注册所接收的token
     * @return 注册成功与否
     */
    @Override
    public boolean eqToken(String token) {
        boolean flag = codeUtils.eqToken(token);

        if (flag){
            User user = codeUtils.findUser(token);
            adduser(user);
            return true;
        }else {
            return false;
        }
    }
}

9、UserController的配置

@RestController
public class UserController {

    @Resource
    UserService userService;

    // 根据用户注册信息进行注册链接的的生成和发送
    @PostMapping("/sendCode")
    public Map<String,String> sendCode(@RequestBody User user){
        boolean flag = userService.sendCode(user);
        Map<String,String> map = new HashMap<>();
        if (flag){
            map.put("msg","邮件发送成功,请前往您的邮箱进行注册验证");
            return map;
        }else {
            map.put("msg","邮件发送失败");
            return map;
        }
    }

    // 判断是否注册成功
    @GetMapping("/lookCode/{token}")
    public Map<String,String> lookCode(@PathVariable("token")String token){
        boolean flag = userService.eqToken(token);
        Map<String,String> map = new HashMap<>();
        if (flag){
            map.put("msg","注册成功");
            /* 后续的操作 ... ...*/
            return map;
        }else {
            map.put("msg","注册码过期,请重新注册");
            return map;
        }
    }
}

因为没有写前端页面,所以就用postman和页面来演示

postman测试

传入user对象

返回结果

邮箱链接

点击注册链接之后

注册成功之后数据库前后对比

注册成功之前

注册成功之后

总结

可能会遇到的问题
【1】有些内部网络不支持发送邮箱,如果保证代码没错,可以换个网络试试
【2】如果是在本地测试,连接的是本地redis,记得开启本地的redis

到此这篇关于Spring Boot邮箱链接注册验证及注册流程的文章就介绍到这了,更多相关Spring Boot邮箱注册验证内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot使用邮箱发送验证码实现注册功能

    本文为大家分享了SpringBoot使用邮箱发送验证码实现注册功能实例,供大家参考,具体内容如下 这里有两种方式: 使用Apache Common包中开源的email组件,通过实例化HtmlEmail()对象,可通过配置外置字典.或yml等配置文件实现灵活配置: 依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId>

  • Spring Boot实现qq邮箱验证码注册和登录验证功能

    1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的验证码是否和后台生成的一致,若一致,将数据写入数据库,完成注册: 登录:通过输入的邮箱查询密码,然后比较密码是否一致,一致就是登录成功. 1.2.整个项目结构图 2.准备 2.1.开启邮箱POP3/SMTP服务 登录qq邮箱后,点击左上方的设置,选择账户,如下图. 然后一直往下滑,看到如下图的POP

  • springboot结合全局异常处理实现登录注册验证

    在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回JSON数据. 方法有很多,这觉得用全局异常处理比较容易上手 全局异常处理 首先来创建一个sprIngboot的web项目或模块,目录结构如下 实体类User.java @Data public class User { private String userName; private String passwold; } 实体类UserResult.java 把数据封装到这里返回

  • Spring Boot邮箱链接注册验证及注册流程

    简单介绍 注册流程 [1]前端提交注册信息 [2]后端接受数据 [3]后端生成一个UUID做为token,将token作为redis的key值,用户数据作为redis的value值,并设置key的时长 [4]后端根据用户信息中的邮箱地址信息,检验用户是否已经注册,如果没有,生成注册链接发送到用户邮箱,如果已经注册,提示用户该邮箱地址已被注册 [5]用户点击邮件中的注册链接 [6]后端判断redis中token是否过期,没有将用户信息保存到数据库,提示用户注册成功 项目源码:https://git

  • Spring Boot数据库链接池配置方法

    配置方法 基于当前的1.5.2.RELEASE的Spring Boot. 依照官方文档,如果增加了如下依赖的配置,或者类路径中存在spring-boot-starter-jdbc的jar,那么已默认启用了数据库链接池. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dep

  • Spring Boot应用通过Docker发布部署的流程分析

    目录 手动部署 1.idea创建spring boot项目 2.项目打成 Jar 包 3.构建 docker image 4.查看并运行镜像 插件部署 运行推送命令 将Spring Boot项目部署到docker中有两种方法,手动部署和插件部署 手动部署 1.idea创建spring boot项目 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/

  • Spring Boot详解创建和运行基础流程

    目录 1. 初始 Spring Boot 1.1 什么是Spring Boot 1.2 Spring Boot 的优点 2. 创建 Spring Boot 项目(Idea) 2.1 首先安装 Spring Assistant 插件 2.2 重启Idea-New Project ① 点击 Spring Assistant 直接Next就可以了 ② Next 之后的页面介绍 ③ 引入依赖, 选择Spring Boot的版本 ④ 选择项目名称和保存路径 ⑤ Spring Boot 项目创建完成 3.

  • Spring Boot实现微信扫码登录功能流程分析

    目录 1. 授权流程说明 第一步:请求CODE 第二步:通过code获取access_token 第三步:通过access_token调用接口 2. 授权流程代码 3. 用户登录和登出 4. Spring AOP校验用户有没有登录 5. 拦截登录校验不通过抛出的异常 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授权

  • Spring Boot利用JSR303实现参数验证的方法实例

    简介 JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation. 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成.很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等.为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定. Bean Va

  • Spring Boot整合邮箱发送邮件实例

    目录 1.准备工作 2.代码整合 总结 1. 准备工作 登录进自己的 qq 邮箱获取授权码 设置 – 账户 – POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 点击开始获取授权码,将授权码保存下来,下面代码整合的时候需要使用 2. 代码整合 创建一个 Spring Boot 项目,引入以下依赖 <!-- email --> <dependency> <groupId>org.springframework.boot</groupI

  • 详解使用spring boot admin监控spring cloud应用程序

    Spring Boot提供的监控接口,例如:/health./info等等,实际上除了之前提到的信息,还有其他信息业需要监控:当前处于活跃状态的会话数量.当前应用的并发数.延迟以及其他度量信息. 最近在找一个spring cloud的监控组件,要求粒度要到每一个接口的,hystrix dashboard显然不适合,也不是这个应用场景.后来发现了spring boot admin这个神器,可以注册到Eureka和spring cloud无缝整合,页面AngularJS写的还算凑合,里面包含有许多功

  • spring boot与spring mvc的区别及功能介绍

    Spring 框架就像一个家族,有众多衍生产品例如 boot.security.jpa等等.但他们的基础都是Spring 的 ioc和 aop ioc 提供了依赖注入的容器 aop ,解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能.Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML. JavaConfig.hin处理起来比较繁琐.于是为了简化开发者的使用,从而创造性地推出了Spr

  • Spring Boot如何使用JDBC获取相关的数据详解

    什么是JDBC Java Database Connectivity 是一种用于执行SQL语句的Java API,与数据库建立连接.发送 操作数据库的语句并处理结果. Spring Boot 使用 JDBC 增加依赖 修改pom.xml:将dependecies 修改为如下两个 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s

随机推荐