最近在设计自己的博客系统,涉及到用户注册与登录验证。

注册这地方我先采用最传统的邮箱验证码方式。具体的实现方式如下:

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实现邮箱验证码注册的更多相关文章

  1. Java实现发送邮箱验证码/注册验证链接

    本文以163邮箱为例 1.准备(邮箱账号,邮箱必须设置POP3/SMTP/IMAP,设置步骤如下:) >>步骤:1 开启授权码服务 >>步骤:2 手机获取验证码 >> ...

  2. spring boot集成 servlet自动注册的两种方式

    有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...

  3. Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取

    〇.参考资料 1.hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2.Spring Boot+Mybatis实现登录注 ...

  4. Spring boot 梳理 - Spring boot自动注册DispatcherServlet

    spring boot提供的DispatcherServlet的name就是“dispatcherServlet”. 源码 public ServletRegistrationBean dispatc ...

  5. Spring Boot之注册servlet三大组件

    由于Spring Boot默认是以jar包的形式启动嵌入式的Servlet容器来启动Spring Boot的web应用是,没有web.xml配置文件 注册三大组件用以下方式 ServletRegist ...

  6. SpringBoot发送邮箱验证码

    一.开启QQ邮箱服务 (1)登陆QQ找到设置,点击账户 (2)往下拉,开启POP3/SMTP服务和IMAP/SMTP服务 当开启IMAP/SMTP会有一串密文密码,保存起来后面要用到 二.spring ...

  7. Spring Boot Admin 2.1.0 全攻略

    转载请标明出处: https://www.fangzhipeng.com 本文出自方志朋的博客 Spring Boot Admin简介 Spring Boot Admin是一个开源社区项目,用于管理和 ...

  8. Spring Boot Admin 2.1.0

    原文:https://blog.csdn.net/forezp/article/details/86105850 Spring Boot Admin简介 Spring Boot Admin是一个开源社 ...

  9. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  10. 使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices wit ...

随机推荐

  1. [粘贴]TiDB Lightning 断点续传

    https://www.bookstack.cn/read/tidb-6.1-zh/tidb-lightning-tidb-lightning-checkpoints.md 大量的数据导入一般耗时数小 ...

  2. [转帖]可直接拿来用的kafka+prometheus+grafana监控告警配置

    kafka配置jmx_exporter 点击:https://github.com/prometheus/jmx_exporter,选择下面的jar包下载: 将下载好的这个agent jar包上传到k ...

  3. [转帖]etcd网络模块解析

    https://www.cnblogs.com/luohaixian/p/17509742.html 1. RaftHttp模块介绍 在etcd里raft模块和网络模块是分开的,raft模块主要负责实 ...

  4. [转帖]性能测试工具netperf安装使用

    https://blog.51cto.com/dingtongxue1990/1853714 netperf工具使用 一.安装 1,下载 liunx下载地址:ftp://ftp.netperf.org ...

  5. [转帖]Jmeter_jmeter-plugins插件的安装使用

    一.安装JMter Plugins 1.官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter ...

  6. 【转帖】8.JVM双亲委派机制(面试常问)

    目录 1.什么是双亲委派机制? 2.双亲委派机制的优势 3.沙箱安全机制 1.什么是双亲委派机制? 双亲委派机制工作原理:(面试) 1.如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这 ...

  7. [转帖]ELF文件详解

    一.ELF概述 1.ELF的定义 ELF(Executable and Linkable Format)文件是一种目标文件格式,常见的ELF格式文件包括:可执行文件.可重定位文件(.o).共享目标文件 ...

  8. 一条sql了解MYSQL的架构设计

    1 前言 对于一个服务端开发来说 MYSQL 可能是他使用最熟悉的数据库工具,然而,大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:它可以建库.建表.建索引,然后就是对里 ...

  9. 源码学习之Spring容器创建原理

    1 前言 众所周知,Spring可以帮我们管理我们需要的bean.在我们需要用到这些bean的时候,可以很方便的获取到它,然后进行一系列的操作.比如,我们定义一个bean MyTestBean pub ...

  10. 取消ts校验的注释

    常用的有以下注释 单行忽略 // @ts-ignore 忽略全文:如果你使用这样,需要放在ts的最顶部哈. // @ts-nocheck 如下 <script lang="ts&quo ...