Springboot实现发送邮件及注册激活步骤

在上一篇文章中,我们使用springboot整合邮件实现发送功能,那么下面来用邮件发送功能实现用户注册,方便我们进一步熟悉邮件发送功能的使用。实现步骤大致如下:进行用户注册同时发送一封激活邮件,邮件里面包含一条激活链接,点击链接把使用UUIDUtils生产发送给用户的邮箱验证码提交进行验证,从而修改用户的激活状态,最后返回登陆页面进行验证登录。

一.效果演示

输入邮箱等一系列信息,点击注册,系统自动发送激活邮件到你绑定的邮箱地址。同时数据库里面增加一条用户信息,其中用户状态(status)默认值为0,需要进行激活改变状态才能授权登录。

如下,打开自己绑定的邮箱点击下面的激活链接,激活成功后跳转到登录页面

点击邮件激活链接的时候,验证链接中的激活码与数据库的code值是否一致,若验证成功则清除数据库中code的值,同时改变用户状态(即status的值由0变为1)。

二.编程实现步骤

1.实现邮件发送服务

如何实现邮件发送服务,可以参考我之前相关的文章:Springboot整合实现邮件发送

2.封装实体类

使用注解的方式快速创建User实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
  private int UserID;
  //账号
  private String UserNumber;
  //密码
  private String Password;
  //邮箱地址
  private String Email;
  /**
   * 状态:0代表未激活,1代表激活
   */
  private Integer status;
  /**
   * 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时
   * 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户
   */
  private String code;
}

3.创建生成UUID的工具类

UUID产生的目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。UUID 来作为数据库中字段是非常不错的选择,保证每次生成的UUID 是唯一的

import java.util.UUID;
/**
 * @Description:使用UUIDUtils生产发送给用户的邮箱验证码
 */
public class UUIDUtils {
  public static String getUUID(){
    return UUID.randomUUID().toString().replace("-","");
   }
}

4.创建Userdao接口

package com.kuang.Dao;
import com.kuang.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
​
//@Mapper : 表示本类是一个 MyBatis 的 Mapper
@Mapper
@Repository
public interface UsersDao {
  //登录
  public User login(@Param("UserNumber") String UserNumber, @Param("Password") String Password);
  //找回密码
  public User retrieve(@Param("Email") String Email);
  /**
   * 用户注册
   * @param user
   */
  void register(User user);
  /**
   * 根据激活码查询用户,之后再进行修改用户状态
   * @param code
   * @return
   */
  User checkCode(String code);
  /**
   * 激活账户,修改用户状态为"1"
   * @param user
   */
  void updateUserStatus(User user);
}

5.创建映射文件UserMapper.xml

注意:在mybatis中映射文件中的namespace是用于绑定Dao接口的,即面向接口编程,dao接口的方法对应mapper中的sql语名。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.Dao.UsersDao">
  <resultMap type="com.kuang.pojo.User" id="User">
    <id column="UserID" property="UserID"/>
    <result column="UserID" property="UserID"/>
    <result column="UserNumber" property="UserNumber"/>
    <result column="Password" property="Password"/>
    <result column="Email" property="Email"/>
    <result column="code" property="code"/>
    <result column="status" property="status"/>
  </resultMap>
​
  <select id="login" resultMap="User">
    select * from user where UserNumber=#{UserNumber} and Password=#{Password} and status=1
  </select>
​
  <select id="retrieve" resultMap="User">
    select * from user where Email=#{Email}
  </select>
​
  <!--注册用户-->
  <insert id="register" parameterType="User" >
    insert into user ( UserNumber, Password,Email,status,code)
    values (#{UserNumber,jdbcType=VARCHAR}, #{Password,jdbcType=VARCHAR}, #{Email,jdbcType=VARCHAR},
        #{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
  </insert>
​
  <!--根据激活码code查询用户-->
  <select id="checkCode" parameterType="String" resultType="User">
    select * from user where code = #[code]
  </select>
​
  <!--激活账户,修改用户状态-->
  <update id="updateUserStatus" parameterType="User">
    update user set status=1,code=null where UserID=#{UserID}
  </update>
</mapper>

6.创建UserService接口

package com.kuang.service;
import com.kuang.pojo.User;
​
public interface UserService {
​
  //用户登录
  public User login(String userName, String password);
  //找回密码
  public User retrieve(String email);
  /**
   * 用户注册
   * @param user
   */
  void register(User user);
  /**
   * 根据激活码code查询用户,之后再进行修改状态
   * @param code
   * @return
   */
  User checkCode(String code);
  /**
   * 激活账户,修改用户状态
   * @param user
   */
  void updateUserStatus(User user);
}

7.创建UserServiceImpl实现类

注意:这里使用到的sendHtmlMail发送邮件方法,在相关的文章:Springboot整合实现邮件发送

package com.kuang.service.impl;
​
import com.kuang.Dao.UsersDao;
import com.kuang.pojo.User;
import com.kuang.service.MailService;
import com.kuang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UsersDao usersDao;
  @Autowired
  private MailService mailService;
     /**
   * 登录验证
   */
  @Override
  public User login(String userName, String password){
    return usersDao.login(userName,password);
   }
     /**
   * 忘记密码,邮件发送找回
   */
  @Override
  public User retrieve(String email){
    return usersDao.retrieve(email);
   }
  /**
   * 用户注册,同时发送一封激活邮件
   * @param user
   */
  @Override
  public void register(User user) {
    usersDao.register(user);
    String code = user.getCode();
    System.out.println("code:"+code);
    String subject = "来自智能化驾校管理系统的激活邮件";
    ///checkCode?code=xxx即是我们点击邮件链接之后进行更改状态的
    String context = "<h1>此邮件为官方激活邮件!请点击下面链接完成激活操作!</h1> <a href="http://localhost:8080/selectCode?code="+code+"">激活请点击:"+code+"</a> ";
    //发送激活邮件
    mailService.sendHtmlMail (user.getEmail(),subject,context);
   }
  /**
   * 根据激活码code进行查询用户,之后再进行修改状态
   * @param code
   * @return
   */
  @Override
  public User checkCode(String code) {
​
    return usersDao.checkCode(code);
   }
  /**
   * 激活账户,修改用户状态
   * @param user
   */
  @Override
  public void updateUserStatus(User user) {
    usersDao.updateUserStatus(user);
   }
}

8.定义核心业务接口UserController控制类

package com.kuang.contorller;
​
import com.kuang.common.UUIDUtils;
import com.kuang.pojo.User;
import com.kuang.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
​
@Controller
public class LoginContorller {
​
  @Resource
  private UserService userService;
​
  @RequestMapping("/main")
  public String login(@RequestParam("UserNumber") String UserNumber,
            @RequestParam("Password") String Password, Model model, HttpSession session) {
​
    //具体的业务
    User user= userService.login(UserNumber,Password);
    if (user!=null){
      session.setAttribute("loginUser",UserNumber);
      return "redirect:/Main";
     }else if(StringUtils.isEmpty(UserNumber) && StringUtils.isEmpty(Password)){
      model.addAttribute("msg","账号或者密码不能为空");
      return "Login";
     }
    else {
      model.addAttribute("msg","账号或者密码错误");
      return "Login";
     }
   }
  /**
   * 注册
   * @param user
   * @return
   */
  @RequestMapping(value = "/registerUser")
  public String register(User user){
    user.setStatus(0);
    String code = UUIDUtils.getUUID()+ UUIDUtils.getUUID();
    user.setCode(code);
    userService.register(user);
    return "login";
   }
  /**
   *校验邮箱中的code激活账户
   * 首先根据激活码code查询用户,之后再把状态修改为"1"
   */
  @RequestMapping(value = "/selectCode")
  public String checkCode(String code){
    User user = userService.checkCode(code);
    System.out.println(user);
    //如果用户不等于null,把用户状态修改status=1
    if (user !=null){
      user.setStatus(1);
      //把code验证码清空,已经不需要了
      user.setCode("");
      System.out.println(user);
      userService.updateUserStatus(user);
     }
    return "login";
   }
  /**
   * 跳转到登录页面
   * @return login
   */
  @RequestMapping(value = "/loginPage")
  public String login(){
    return "login";
   }
}

9.编写页面内容

在我们的项目开发过程中我们需要向后端发送请求,实现前后端的数据交互,这里使用了Thymeleaf模板引擎+form的方法。后台按照post的地址进行接收即可,需要注意的是,提交数据的时候,button或者input都设置成为submit

<div id="signup-box" class="signup-box widget-box no-border">
   <div class="widget-body">
     <div class="widget-main">
       <h4 class="header green lighter bigger">
         <i class="icon-group blue"></i>
         <span id="beatText1">注册新用户</span>
       </h4>
​
       <div class="space-6"></div>
       <p> 请输入你的信息: </p>
​
       <form th:action="@{/registerUser}" method="post">
         <fieldset>
           <label>
             <span class="block input-icon input-icon-right">
            <input type="email" class="span12" id="ZCEmail" name="Email" placeholder="邮箱"/>
               <i class="icon-envelope"></i>
             </span>
           </label>
​
           <label>
             <span class="block input-icon input-icon-right">
        <input type="text" class="span12" id="ZCUserNumber" name="UserNumber" placeholder="账号"/>
               <i class="icon-user"></i>
             </span>
           </label>
​
           <label>
             <span class="block input-icon input-icon-right">
         <input type="password" class="span12" id="ZCPassword" name="Password" placeholder="密码"/>
               <i class="icon-lock"></i>
             </span>
           </label>
​
           <label>
             <span class="block input-icon input-icon-right">
               <input type="password" class="span12" placeholder="确认密码"/>
               <i class="icon-retweet"></i>
             </span>
           </label>
​
           <label>
             <input type="checkbox"/>
             <span class="lbl">
               我接受本
               <a href="#" rel="external nofollow"  rel="external nofollow" >用户协议</a>
             </span>
           </label>
​
           <div class="space-24"></div>
​
           <div class="clearfix">
             <button type="reset" class="width-30 pull-left btn btn-small">
               <i class="icon-refresh"></i>
               重置
             </button>
​
             <button type="submit" class="width-65 pull-right btn btn-small btn-success">
               注册
               <i class="icon-arrow-right icon-on-right"></i>
             </button>
           </div>
         </fieldset>
       </form>
     </div>
​
     <div class="toolbar center">
       <a href="#" rel="external nofollow"  rel="external nofollow"  onclick="show_box('login-box'); return false;"
        class="back-to-login-link">
         <i class="icon-arrow-left"></i>
         返回登陆
       </a>
     </div>

10.完整的项目部署

总结:使用Springboot实现发送邮件注册激活的步骤大致如此,需要更加完整的项目逻辑可以自己完善

到此这篇关于Springboot实现发送邮件及注册激活步骤的文章就介绍到这了,更多相关Springboot发送邮件注册激活内容请搜索179885.Com以前的文章或继续浏览下面的相关文章希望大家以后多多支持179885.Com!

猜你在找的Springboot实现发送邮件及注册激活步骤相关文章

今天给大家带来的是关于Java的相关知识,文章围绕着Java常见的排序算法展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
TCP是一种传输控制协议,是面向连接的、可靠的、基于字节流之间的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,TCP完成第四层传输层所指定的功
今天给大家带来的是关于Java的相关知识,文章围绕着Java如何实现树的同构展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
本文主要介绍了MyBatis-Plus 使用枚举自动关联注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起
了SpringBoot集成Redis,并自定义对象序列化操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
为了方便邮件发送功能的使用,我们用邮件发送功能实现用户注册,实现步骤大概就是进行用户注册同时发送一封激活邮件,邮件里附带激活链接,关于Springboot发送邮件注册激
今天给大家带来的是关于Java的相关知识总结,文章围绕着Java循环队列与非循环队列的区别展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
此篇文章主要介绍了AtomicReference的出现背景,AtomicReference的使用场景,以及介绍了AtomicReference的源码,重点方法的源码分析
了springboot初始化执行sql语句的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。本章节重点给大家介绍SpringCloud Alibaba项目
今天给大家带来的是关于Java的相关知识,文章围绕着java如何集成swagger组件展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
今天给大家带来的是关于Java的相关知识,文章围绕着启动Tomcat时出现大量乱码的解决方法展开,文中有非常详细的介绍及图文示例,需求的大佬可以参考下