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

一.效果演示

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

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

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

二.编程实现步骤

1.实现邮件发送服务

如何实现邮件发送服务,可以参考我之前相关的文章:Springboot整合实现邮件发送_小灰灰~~的博客-CSDN博客

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整合实现邮件发送_小灰灰~~的博客-CSDN博客

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 {@Autowiredprivate UsersDao usersDao;@Autowiredprivate MailService mailService;/*** 登录验证*/@Overridepublic User login(String userName, String password){return usersDao.login(userName,password);}/*** 忘记密码,邮件发送找回*/@Overridepublic User retrieve(String email){return usersDao.retrieve(email);}/*** 用户注册,同时发送一封激活邮件* @param user*/@Overridepublic 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*/@Overridepublic User checkCode(String code) {
​return usersDao.checkCode(code);}/*** 激活账户,修改用户状态* @param user*/@Overridepublic 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 {
​@Resourceprivate 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=1if (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="#">用户协议</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="#" onclick="show_box('login-box'); return false;"class="back-to-login-link"><i class="icon-arrow-left"></i>返回登陆</a></div>

10.完整的项目部署

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

Springboot发送邮件实现注册激活相关推荐

  1. SpringBoot发送邮件(二)发送包含图片的邮件

    前言:使用发邮件这个功能不难,但是也有一些坑,下面我把开发邮件功能总结了一下分享给大家,同时为了避免篇幅过长,导致大家看的不仔细或看一半不想看了,我将这个功能细分了一下,写了好几篇供大家各取所需. S ...

  2. JavaWeb邮箱注册激活账号

    JavaWeb邮箱注册激活账号 邮箱工具类MailUtil 用法 注意事项 激活码工具类UuidUtil 用法 邮箱工具类MailUtil /*** 发邮件工具类*/ public final cla ...

  3. ThinkPHP5实现注册激活邮件

    ThinkPHP5实现注册激活邮件 代码:http://download.csdn.net/detail/u012995856/9815802 邮件发送部分,参考:http://www.thinkph ...

  4. SpringBoot实现邮箱注册

    SpringBoot实现邮箱注册 功能说明 在BuaaMap的产品设计中,综合考虑安全性.易用性等,用户需以自己的邮箱为唯一标识注册账户.因此,后端必须支持邮箱发送.验证功能来实现这一需求. 具体来说 ...

  5. 【亲测有效】如何在win10上激活Burp Suite,如何注册激活Burp Suite,破解Burp Suite的详细步骤

    Burp Suite是一款很实用的安全漏扫测试工具,是安全从业者的必备武器之一.它集成了很多使用的渗透测试工具.不仅支持自动扫描还支持手动漏扫. 本文介绍一下该工具的具体破解和激活步骤.因为网上好多文 ...

  6. SpringBoot 发送邮件功能实现

    背景 有个小伙伴问我你以前发邮件功能怎么弄的.然后我就给他找了个demo,正好在此也写一下,分享给大家. 理清痛点 发送邮件,大家可以想一下,坑的地方在哪? 我觉得是三个吧. 第一:邮件白名单问题. ...

  7. Sublime Text 3 注册激活码

    Sublime Text 3 注册激活码 ----- BEGIN LICENSE ----- sgbteam Single User License EA7E-1153259 8891CBB9 F15 ...

  8. mathematica 下载安装注册激活大本营

    下载 http://iask.sina.com.cn/u/1649925782/ish?folderid=10209 根据自己的需要选择合适的版本,因为文件较大,所以被切分成很多分卷(都是以part* ...

  9. springboot发送邮件_SpringBoot发送邮件如何实现,SpringBoot发送邮件详解(附代码)...

    在很多的项目开发中,总会遇到消息通知的场景,比如某个广告主提交一个表单,我们要通知提醒运营人员及时查看. 消息通知的形式也有很多,比如:短信.邮件.app推送等,本文主要给大家描述一下邮件通知的形式, ...

最新文章

  1. 潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录
  2. robot.txt 搜索引擎 蜘蛛爬虫 搜索规则
  3. 字节数组输入流读取操作
  4. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-目录
  5. 一个公式、五大指标帮你构建产品经理数据分析思维
  6. 三维重建19:锯齿排序
  7. Sqlite3 for Linux 可视化工具
  8. 浅谈流处理算法 (1) – 蓄水池采样
  9. oracle12 扩充表空间,oracle查询及扩充表空间
  10. 了解下JavaScript中的prototype
  11. 原根(扩展欧几里得+欧拉函数)
  12. 《深度学习笔记》——深度神经网络的调试笔记
  13. imreadraw的注册
  14. 如何用python计算增长率_如何用excel函数来计算增长率?
  15. mysql 在不同数据库中创建定时同步任务,将每分钟数据转每5分钟统计
  16. stream报错: stream has already been operated upon or closed
  17. 【C语言】用回调函数实现冒泡排序
  18. 浅谈Nginx转发匹配规则
  19. elasticsearch删除过期数据
  20. C语言数组的创建初始化以及使用

热门文章

  1. 汽车PKE无钥匙入一键启动手机智能控车系统
  2. 华为Mate 20系列演绎AI黑科技,AR翻译帮用户走遍天下告别语言障碍
  3. 通达OA更改上传附件大小限制的解决办法
  4. 串联谐振试验装置升压达不到目标电压的原因是什么?
  5. 在vue中使用antV-G2展示折线图
  6. 分享一下,如何防止工具(八门神器)进行内存修改!
  7. vb.net 实现剪切文件_这个软件让手机和电脑间传输文件超方便,重点是体积小没广告...
  8. TextView 利用html换行和加粗字体
  9. 与狼共舞——观《狼》有感
  10. Oracle 分页查询 标准