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

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

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. 面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?

    写在开头 面试官:"小伙子,用过final关键字吗?" 我:"必须用过呀" 面试官:"好,那来说一说你对这个关键字的理解吧,再说一说它与finally ...

  2. 监控服务器所有磁盘的inode使用情况

    监控服务器所有磁盘的inode使用情况 背景 因为前期数据库开启了审计 但是如果是 DB模式的话 $aud 表的冲突和使用太多了 所以专家建议将审计表放到OS 因为数据库的访问量特别高. 审计的信息又 ...

  3. [转帖]Java 认证与授权(JAAS)介绍

    https://www.cnblogs.com/wuyongyin/p/16981469.html JAAS(Java Authentication Authorization Service),即 ...

  4. ipset的学习与使用

    ipset的学习与使用 场景说明 虽然可以通过: firewall-cmd --zone=trusted --add-source=$1 --permanent && firewall ...

  5. 【转帖】Linux性能优化(十六)——中断绑定

    一.中断绑定简介 1.中断简介 计算机中,中断是一种电信号,由硬件产生并直接送到中断控制器上,再由中断控制器向CPU发送中断信号,CPU检测到信号后,中断当前工作转而处理中断信号.CPU会通知操作系统 ...

  6. [转帖]基本系统调用性能lmbench测试方法和下载

    简介 Lmbench是一套简易,可移植的,符合ANSI/C标准为UNIX/POSIX而制定的微型测评工具.一般来说,它衡量两个关键特征:反应时间和带宽. Lmbench旨在使系统开发者深入了解关键操作 ...

  7. 查找linux下面某目录下重名出现的文件以及次数

    find . -name '*.data' -exec basename {} \;| sort | uniq -w32 --all-repeated=separate | uniq -c | sor ...

  8. 京东金融Android瘦身探索与实践

    作者:京东科技 冯建华 一.背景 随着业务不断迭代更新,App的大小也在快速增加,2019年~2022年期间一度超过了117M,期间我们也做了部分优化如图1红色部分所示,但在做优化的同时面临着新的增量 ...

  9. Linux线程API使用与分析

    线程是操作系统进程调度器可调度的最小粒度的执行单元 执行ps -eLF查看线程 UID PID PPID LWP C NLWP SZ RSS PSR STIME TTY TIME CMD root 1 ...

  10. python中,Microsoft Visual C++ 14.0 or greater is required问题解决方案

    今天在写一个小程序,安装依赖的时候发现这个问题,平时都是直接安装Visual Studio解决,但是这个安装太大了,所以解决看看怎么安装是最方便的,最容易解决的. 下面这个就是出现的问题: build ...