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

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

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.comusername: 836491123@qq.com  # 邮箱地址password: wlcfnoewxcbaeb123 # 授权码properties:mail:smtp:ssl:enable: true# thymeleafthymeleaf:cache: falseprefix: classpath:/templates/suffix: .htmlmvc:date-format: yyyy-MM-dd# mysqldatasource:driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: root123url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT&useSSL=falsetype: com.alibaba.druid.pool.DruidDataSource
# mybatis
mybatis:config-location: classpath:mybatis/mybatis-config.xmlmapper-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 userset 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 {@Autowiredprivate UserDao userDao;@Autowiredprivate MailService mailService;@Overridepublic 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);}@Overridepublic User getUserByActiveCode(String activeCode) {return userDao.selectUserByActiveCode(activeCode);}@Overridepublic void modify(User user) {userDao.update(user);}@Overridepublic 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());@AutowiredJavaMailSenderImpl mailSender;@Value("${spring.mail.username}")private String from;@Overridepublic 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);}}@Overridepublic 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 {@Autowiredprivate 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=1if (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. Spring Boot项目邮箱验证码功能的实现(以QQ邮箱为例)

    既然前两天翻出我大学时期做的一个项目,那正好顺手将其中的邮箱验证码功能也分享记录一下. 开启QQ邮箱传输协议服务 进入QQ邮箱界面,点击设置--账户--开启以下两个服务,当开启IMAP/SMTP会有一 ...

  2. mysql查询使用qq邮箱注册_Spring Boot实现qq邮箱验证码注册和登录验证功能

    1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的 ...

  3. Vue+Spring Boot实现图片验证码、邮箱验证码以及Cookie记住我功能(前后端代码详解)

    Vue实现图片验证码.邮箱验证码以及Cookie记住我功能 前言 图片验证码实现 Vue前端实现 Spring Boot后端实现 邮箱验证码实现 Vue前端实现 Spring Boot后端实现 Coo ...

  4. Spring boot 发送手机验证码

    由于阿里云现在的短信签名无法通过申请,所以我这里选择了中国网建SMS短信平台(手机号注册即用,有免费赠送的几条短信测试) demo代码地址:https://github.com/mer97/sprin ...

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

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

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

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

  7. 由浅入深分布式(5)dubbo提供者用内网地址注册provider以及 spring boot admin client用主机名注册spring boot admin server

    之前遇到过dubbo提供者用内网地址注册provider的问题 当时改了host文件成功了 但是没有想为什么会有这个问题 现在使用spring boot admin 来监控spring boot项目出 ...

  8. Spring Boot Admin 2.1.0 全攻略

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序. ...

  9. 第8章Spring Boot整合监控

    8.1 使用actuator监控 8.1.1 actuator是什么 在Spring Boot的众多Starter POMs中有一个特殊的模块,不同于其他模块大多用于开发业务功能或连接一些其他外部资源 ...

  10. Spring Boot统一异常处理的拦截指南

    通常我们在Spring Boot中设置的统一异常处理只能处理Controller抛出的异常.有些请求还没到Controller就出异常了,而这些异常不能被统一异常捕获,例如Servlet容器的某些异常 ...

最新文章

  1. vue2.0 之文本渲染-v-html、v-text
  2. dsp调音一次多少钱_DSP调音中EQ使用技巧
  3. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
  4. 如何在Win Server 2008R2环境下,把域帐户加到本地管理员组??
  5. java 文曲星猜数字,文曲星里的猜数字代码(原创)
  6. 程序员常常会用到的几款文本编辑器
  7. 【Android开发】【数据库】Realm For Android
  8. python mac地址 js_使用Python从设备获取MAC地址
  9. gini系数 决策树_决策树原理,机器学习系列
  10. SpringMVC——架构,搭建,SSM搭建,POST请求乱码问题,参数转换器
  11. Linux 查看日志的方法
  12. 中国钢铁物流行业发展策略分析及投资建议咨询报告2021-2027年
  13. 2023年辽宁大学马克思主义中国化研究考研上岸前辈备考经验指导
  14. 谷歌分析数据导入4种方式
  15. Python从图片提取文字
  16. 漫谈程序员(十)大白菜装机版安装win7系统使用教程
  17. 查看ajax传来的数据,jQuery AJAX 方法 success()后台传来的4种数据
  18. 原生js实现轮盘抽奖,控制中奖概率(完整示例)
  19. pageadmin CMS网站制作教程
  20. Java面试题 java高级

热门文章

  1. 咱们的课程里,有微信的这种菜单示例吗?---酷课堂iOS交流群问答整理(201810期)
  2. 无人机倾斜摄影详解,三维实景建模应用
  3. Windows 启动 Idea 报错 if you already hava a 64-bit JDK ... 以及 failed to create jvm...
  4. 中华石杉Java面试突击第一季笔记二(分布式搜索引擎)
  5. php随机产生六位数密码
  6. 适应度函数及遗传操作
  7. win10系统CAJViewer 绿色提示缺少由于找不到 MSVCR71.dll
  8. 自己来制作iso镜像用于安装OpenBSD
  9. linux下如何统计一个目录下的文件个数以及代码总行数的命令
  10. msyql创建数据库并指定字符集