spring boot实现邮箱验证码注册
最近在设计自己的博客系统,涉及到用户注册与登录验证。
注册这地方我先采用最传统的邮箱验证码方式。具体的实现方式如下:
1.有关如何配置spring boot发送邮件,请参考我的另一篇文章:
https://blog.csdn.net/IndexMan/article/details/87563438
2.搞懂第1步再继续下面的操作
项目源码:https://gitee.com/indexman/mailtest.git
项目总体结构:

1.创建表
创建数据库:test
编码:uft-8
执行以下SQL
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`password` varchar(100) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`active_code` varchar(100) DEFAULT NULL,
`active_status` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.搭建spring boot环境
2.1 配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laoxu.java</groupId>
<artifactId>mailtest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mailtest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--Druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 配置application.yml文件
server:
port: 8080
spring:
# 配置发送方信息
mail:
host: smtp.qq.com
username: 836491123@qq.com # 邮箱地址
password: wlcfnoewxcbaeb123 # 授权码
properties:
mail:
smtp:
ssl:
enable: true
# thymeleaf
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
mvc:
date-format: yyyy-MM-dd
# mysql
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root123
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT&useSSL=false
type: com.alibaba.druid.pool.DruidDataSource
# mybatis
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
2.3 工具类
/**
* @description: ID管理类
* @author: luohanye
* @create: 2019-04-19
**/
public class IDUtils {
public static final Logger logger = LoggerFactory.getLogger(IDUtils.class);
public static String getUUID(){
return UUID.randomUUID().toString().replace("-","");
}
public static void main(String[] args) {
System.out.println(getUUID());
logger.debug("test");
}
}
3.编写User模型
/**
* @description: 用户
* @author: luohanye
* @create: 2019-04-17
**/
@Data
public class User implements Serializable {
private Integer id;
private String username;
private String password;
private String email;
// 激活状态 0 未激活 1 已激活
private Integer activeStatus;
// 激活码
private String activeCode;
}
4.编写UserDao
@Component
public interface UserDao {
/**
* 注册
* @param user
*/
void insert(User user);
/**
* 根据激活码查询用户
* @param activeCode
* @return
*/
User selectUserByActiveCode(String activeCode);
/**
* 更新用户
* @param user
*/
void update(User user);
/**
* 查询用户
* @param user
* @return
*/
User select(User user);
}
5.编写mapper文件
<?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.laoxu.java.mailtest.dao.UserDao">
<resultMap id="userMap" type="com.laoxu.java.mailtest.entity.User">
<result property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<result property="email" column="email"/>
<result property="activeStatus" column="active_status"/>
<result property="activeCode" column="active_code"/>
</resultMap>
<insert id="insert" parameterType="com.laoxu.java.mailtest.entity.User">
insert into user ( username, password,email,active_status,active_code)
values (#{username}, #{password}, #{email},#{activeStatus},#{activeCode})
</insert>
<select id="selectUserByActiveCode" parameterType="String" resultType="com.laoxu.java.mailtest.entity.User">
select * from user where active_code = #{activeCode}
</select>
<!--激活账户,修改用户状态-->
<update id="update" parameterType="com.laoxu.java.mailtest.entity.User">
update user
set active_status=#{activeStatus},username=#{username},password=#{password},
email=#{email}, active_status=#{activeStatus},active_code=#{activeCode}
where id=#{id}
</update>
<!--登录,根据 activeStatus=1 进行查询-->
<select id="select" resultType="com.laoxu.java.mailtest.entity.User">
select * from user where username=#{username} and password=#{password} and active_status=1
</select>
</mapper>
6.编写UserService及其实现
public interface UserService {
/**
* 用户注册
* @param user
*/
void add(User user);
/**
* 根据激活码查找用户
* @param activeCode
* @return
*/
User getUserByActiveCode(String activeCode);
/**
* 修改
* @param user
*/
void modify(User user);
/**
* 登录
* @param user
* @return
*/
User get(User user);
}
/**
* @description:
* @author: luohanye
* @create: 2019-04-18
**/
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private MailService mailService;
@Override
public void add(User user) {
userDao.insert(user);
//获取激活码
String code = user.getActiveCode();
System.out.println("激活码:"+code);
//主题
String subject = "来自罗汉爷网站的激活邮件";
//上面的激活码发送到用户注册邮箱
String context = "<a href=\"http://localhost:8080/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
//发送激活邮件
mailService.sendMimeMail (user.getEmail(),subject,context);
}
@Override
public User getUserByActiveCode(String activeCode) {
return userDao.selectUserByActiveCode(activeCode);
}
@Override
public void modify(User user) {
userDao.update(user);
}
@Override
public User get(User user) {
return userDao.select(user);
}
}
7.编写MailService及其实现
public interface MailService {
/**
* 发送多媒体类型邮件
* @param to
* @param subject
* @param content
*/
void sendMimeMail(String to, String subject, String content);
void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
}
/**
* @description: 邮件处理类
* @author: luohanye
* @create: 2019-04-19
**/
@Service
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
JavaMailSenderImpl mailSender;
@Value("${spring.mail.username}")
private String from;
@Override
public void sendMimeMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
try {
helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setSubject(subject);
helper.setTo(to);
helper.setText(content, true);
mailSender.send(message);
//日志信息
logger.info("邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送邮件时发生异常!", e);
}
}
@Override
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
try{
helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setSubject(subject);
helper.setTo(to);
helper.setText(content, true);
FileSystemResource fs = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, fs);
mailSender.send(message);
}catch (MessagingException e) {
logger.error("发送邮件时发生异常!", e);
}
}
}
8.前端页面
去看源码。
9.编写UserController
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
/**
* 注册
* @param user
* @return
*/
@RequestMapping(value = "/register")
public String register(User user){
user.setActiveStatus(0);
String activeCode = IDUtils.getUUID();
user.setActiveCode(activeCode);
userService.add(user);
return "success";
}
/**
* 校验激活码
* @param code
* @return
*/
@RequestMapping(value = "/checkCode")
public String checkCode(String code){
User user = userService.getUserByActiveCode(code);
//如果用户不等于null,把用户状态修改status=1
if (user !=null){
user.setActiveStatus(1);
//把code验证码清空,已经不需要了
user.setActiveCode("");
userService.modify(user);
return "activeSuccess";
}
return "login";
}
/**
* 登录
* @return login
*/
@RequestMapping(value = "/loginPage")
public String login(){
return "login";
}
/**
* 登录
*/
@RequestMapping(value = "/login")
public String login(User user, Model model){
User u = userService.get(user);
if (u !=null){
return "welcome";
}
return "error";
}
}
10.编写IndexController
@Controller
public class IndexController {
@RequestMapping("/")
public String index(){
return "index";
}
}
11.测试应用
11.1 注册


11.2 激活
登录注册邮箱查看邮件:

点击激活链接:

11.3 登录成功

11.4 登录失败

项目源码:https://gitee.com/indexman/mailtest.git
spring boot实现邮箱验证码注册的更多相关文章
- Java实现发送邮箱验证码/注册验证链接
本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...
- spring boot集成 servlet自动注册的两种方式
有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...
- Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取
〇.参考资料 1.hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2.Spring Boot+Mybatis实现登录注 ...
- Spring boot 梳理 - Spring boot自动注册DispatcherServlet
spring boot提供的DispatcherServlet的name就是“dispatcherServlet”. 源码 public ServletRegistrationBean dispatc ...
- Spring Boot之注册servlet三大组件
由于Spring Boot默认是以jar包的形式启动嵌入式的Servlet容器来启动Spring Boot的web应用是,没有web.xml配置文件 注册三大组件用以下方式 ServletRegist ...
- SpringBoot发送邮箱验证码
一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring ...
- Spring Boot Admin 2.1.0 全攻略
转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 Spring Boot Admin简介 Spring Boot Admin是一个开源社区项目,用于管理和 ...
- Spring Boot Admin 2.1.0
原文:https://blog.csdn.net/forezp/article/details/86105850 Spring Boot Admin简介 Spring Boot Admin是一个开源社 ...
- 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用
这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...
- 使用Ratpack和Spring Boot打造高性能的JVM微服务应用
使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...
随机推荐
- TCP连接状态的多种判断方法
前言 在TCP网络编程模型中,无论是客户端还是服务端,在网络编程的过程中都需要判断连接的对方网络状态是否正常.在linux系统中,有很多种方式可以判断连接的对方网络是否已经断开. 通过错误码和信号 ...
- [转帖]技术分享 | MySQL:一文弄懂时区&time_zone
https://opensource.actionsky.com/20211214-time_zone/ 作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析.性能优化,个人博客:https:// ...
- 【转帖】ESXi 6.x 安装storcli监控raid卡状态
https://b2b.baidu.com/land?id=744541c6188f7937d6dc97d6fb9142ff10 脚本宝典收集整理的这篇文章主要介绍了ESXi 6.x 安装storcl ...
- [转帖]【mmap】深度分析mmap:是什么 为什么 怎么用 性能总结
https://blog.csdn.net/bandaoyu/article/details/106750990 目录 有什么用? 1.文件映射 2.分配内存(匿名文件映射) mmap基础概念 mma ...
- 【转帖】eBay 云计算“网”事|网络重传篇
https://www.infoq.cn/article/iy1drmf6wk8up14dchq8/ #导读 在之前的eBay云计算"网"事|网络超时篇和eBay云计算" ...
- Redis性能问题诊断以及scan命令耗时分析
Redis性能问题诊断以及scan命令耗时分析 摘要 最近公司有项目反馈卡顿. 卡顿一小时后自己被拉入群聊. 同事已经基本上定位到问题原因. 我这边想使用朴素的性能观点进行一下性能问题的拆解 为了提高 ...
- [转帖]HotSpot 虚拟机对象探秘
https://www.cnblogs.com/xiaojiesir/p/15593092.html 对象的创建 一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和 ...
- FS OFS RS ORS
- 我们开源了一个轻量的 Web IDE UI 框架
我们开源了一个轻量的 Web IDE UI 框架 Molecule 一个轻量的 Web IDE UI 框架 简介 Molecule 是一个受 VS Code 启发,使用 React.js 构建的 We ...
- ElementUI实现表格(table) 行上下移动的效果
参考地址 https://blog.csdn.net/sunshine0508/article/details/88390155 看大佬的地址 <div id="app"&g ...