项目源码:https://gitee.com/smfx1314/springbootemail

上一篇文章已经讲到如何springboot如何实现邮件的发送,趁热打铁,这篇文章实现如下功能。

很多网站注册功能都会给您注册的邮箱发送一封邮件,里面是一串连接,点击链接激活功能,今天咱们就实现这个功能。

原理:

在您注册的时候,User类中设置一个邮件码code,同时用户状态未激活。邮件码可以通过UUID实现,这样在注册的时候发送一封邮件,把这个邮件码以html的格式发送到指定邮箱,然后通过点击链接,把邮件码在提交到后台进行对比,如果邮件中的邮件码跟发送时设置的一样,就把用户状态改为激活,然后登陆即可。

开始编码

第一步搭搭建开发环境,只需要通过springboot整合mybatis实现用户注册登录功能即可,然后在注册的时候调用邮件接口发送邮件就可以了

项目结构



引入相关依赖,这里使用的是阿里巴巴druid数据库连接池

pom.xml

<properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--MyBatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency> <!--SpringBoot测试支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> <!--SpringBoot热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
</dependency> <!--Druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--邮件-->
<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>
</dependencies>

上面引入了热部署依赖,不引人页是可以的。另外还有thymeleaf模板引擎,springboot默认支持此引擎

引入相关依赖之后,节下来根据项目结构创建对应的包,请参考上文中的结构图。在目录结构完善之后,下面开始配置相关属性

application.properties配置

##热部署
spring.devtools.remote.restart.enabled=true
spring.devtools.restart.additional-paths=src/main ## 数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test2?characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=“你的用户名”
spring.datasource.password=“你的密码” #默认编码配置
spring.http.encoding.charset=UTF-8
spring.http.encoding.force=true
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8 ## MyBatis相关配置
mybatis.type-aliases-package=com.jiangfeixiang.springbootemail.entity
mybatis.mapper-locations=mapper/*.xml spring.thymeleaf.prefix=classpath:/templates/ ##邮箱服务器地址
##QQ smtp.qq.com
##sina smtp.sina.cn
##aliyun smtp.aliyun.com
##163 smtp.163.com
spring.mail.host=smtp.qq.com
##邮箱用户名
spring.mail.username=1016767658@qq.com
##邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面获取)
spring.mail.password=ivhkrccrallkbdcf
##编码格式
spring.mail.default-encoding=UTF-8
##发送邮件地址
spring.mail.from=1016767658@qq.com

注意:数据库配置全部改写成您自己的账号密码,数据库等信息。邮箱配置不明白的可以参考上一篇springboot如何实现邮件的发送

以上都完成之后,接下来是完善实体类,另外数据库这里就不在提示了,只有一个user类,可以自己完善一下

实体类User

public class User implements Serializable {
private Integer id;
private String username;
private String password;
private String useremail;
/**
* 状态:0代表未激活,1代表激活
*/
private Integer status;
/**
* 利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时
* 在做一个校验如果用户传来的code跟我们发生的code一致,更改状态为“1”来激活用户
*/
private String code; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public String getUseremail() {
return useremail;
} public void setUseremail(String useremail) {
this.useremail = useremail;
} public void setPassword(String password) {
this.password = password;
} public Integer getStatus() {
return status;
} public void setStatus(Integer status) {
this.status = status;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", useremail='" + useremail + '\'' +
", status=" + status +
", code='" + code + '\'' +
'}';
}
}

说明:

  • 用户状态status:0代表未激活,1代表激活,注册的时候,默认是0,只有激活邮箱激活码可以更改为1
  • 邮箱激活码code:利用UUID生成一段数字,发动到用户邮箱,当用户点击链接时,在做一个校验,如果用户传来的code跟我们发送的code一致,更改状态为“1”来激活用户

实体类完成之后下面开始完善dao以及对应的mapper.xml文件

对应UserDao

public interface UserDao {
/**
* 用户注册,注册的时候默认状态为0:未激活,并且调用邮件服务发送激活码到邮箱
* @param user
*/
void register(User user); /**
* 点击邮箱中的激活码进行激活,根据激活码查询用户,之后再进行修改用户状态为1进行激活
* @param code
* @return
*/
User checkCode(String code); /**
* 激活账户,修改用户状态为“1”进行激活
* @param user
*/
void updateUserStatus(User user); /**
* 登录,根据用户状态为“1”来查询
* @param user
* @return
*/
User loginUser(User user);
}

代码中有详细说明,接下来是UserDao对应的映射文件UserMapper.xml

UserMapper.xml

<?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.jiangfeixiang.springbootemail.dao.UserDao" > <!--注册用户-->
<insert id="register" parameterType="com.jiangfeixiang.springbootemail.entity.User" >
insert into user ( username, password,useremail,status,code)
values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{useremail,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
</insert> <!--根据激活码code查询用户-->
<select id="checkCode" parameterType="String" resultType="com.jiangfeixiang.springbootemail.entity.User">
select * from user where code = #{code}
</select> <!--激活账户,修改用户状态-->
<update id="updateUserStatus" parameterType="com.jiangfeixiang.springbootemail.entity.User">
update user set status=1,code=null where id=#{id}
</update> <!--登录,根据 status=1 进行查询-->
<select id="loginUser" resultType="com.jiangfeixiang.springbootemail.entity.User" >
select * from user where username=#{username} and password=#{password} and status=1
</select>
</mapper>

dao以及对象映射文件完成之后,开始编写Service接口与实现类

UserService接口

public interface UserService {
/**
* 用户注册,
* @param user
*/
void register(User user); /**
* 根据激活码code查询用户,之后再进行修改状态
* @param code
* @return
*/
User checkCode(String code); /**
* 激活账户,修改用户状态为“1”
* @param user
*/
void updateUserStatus(User user); /**
* 登录
* @param user
* @return
*/
User loginUser(User user);
}

下面是与之对应的实现类

UserServiceImpl实现类

@Service
@Transactional
public class UserServiceImpl implements UserService { @Autowired
private UserDao userDao; /**
* 注入邮件接口
*/
@Autowired
private MailService mailService; /**
* 用户注册,同时发送一封激活邮件
* @param user
*/
@Override
public void register(User user) {
userDao.register(user);
//获取激活码
String code = user.getCode();
System.out.println("code:"+code);
//主题
String subject = "来自xxx网站的激活邮件";
//user/checkCode?code=code(激活码)是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活
//上面的激活码发送到用户注册邮箱
String context = "<a href=\"/user/checkCode?code="+code+"\">激活请点击:"+code+"</a>";
//发送激活邮件
mailService.sendHtmlMail (user.getUseremail(),subject,context);
} /**
* 根据激活码code进行查询用户,之后再进行修改状态
* @param code
* @return
*/
@Override
public User checkCode(String code) { return userDao.checkCode(code);
} /**
* 激活账户,修改用户状态
* @param user
*/
@Override
public void updateUserStatus(User user) {
userDao.updateUserStatus(user);
} /**
* 登录
* @param user
* @return
*/
@Override
public User loginUser(User user) {
User user1 = userDao.loginUser(user);
if (user1 !=null){
return user1;
}
return null;
}
}

邮件接口

public interface MailService {

    /**
* 发送文本邮件
* @param to
* @param subject
* @param content
*/
//void sendSimpleMail(String to, String subject, String content); /**
* 发送HTML邮件,方便用户点击附带的code用来验证激活账户
* @param to
* @param content
*/
void sendHtmlMail(String to, String subject, String content); }

下面是对应的实现类

MailServiceImpl实现类

@Service
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
/**
* 配置文件中我的qq邮箱
*/
@Value("${spring.mail.from}")
private String from; /**
* 发送HTML邮件
* @param to 收件者
* @param subject 邮件主题
* @param content 文本内容
*/
@Override
public void sendHtmlMail(String to,String subject,String content) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
try {
helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(subject);
helper.setTo(to);
helper.setText(content, true);
mailSender.send(message);
//日志信息
logger.info("邮件已经发送。");
} catch (MessagingException e) {
logger.error("发送邮件时发生异常!", e);
}
}
}

主程序入口上不要忘记添加@MapperScan

@SpringBootApplication
@MapperScan("com.jiangfeixiang.springbootemail.dao")
public class SpringbootemailApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootemailApplication.class, args);
} }

DruidDbConfig数据源配置

@Configuration
public class DruidDbConfig {
private Logger logger = LoggerFactory.getLogger(DruidDbConfig.class); @ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DruidDataSource druidConfig(){ return new DruidDataSource();
}
}

UUIDUtils 随机生成激活码

public class UUIDUtils {
public static String getUUID(){
return UUID.randomUUID().toString().replace("-","");
}
}

UserController控制类

@Controller
@RequestMapping("/user")
public class UserController { @Autowired
private UserService userService; /**
* 注册
* @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 "success";
} /**
*校验邮箱中的code激活账户
* 首先根据激活码code查询用户,之后再把状态修改为"1"
*/
@RequestMapping(value = "/checkCode")
public String checkCode(String code){
User user = userService.checkCode(code);
System.out.println(user);
//如果用户不等于null,把用户状态修改status=1
if (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";
} /**
* 登录
*/
@RequestMapping(value = "/loginUser")
public String login(User user, Model model){
User u = userService.loginUser(user);
if (u !=null){
return "welcome";
}
return "login";
}
}

首页控制类

@Controller
public class IndexController {
/**
* 首页,localhost:8080直接返回index页面
*/
@RequestMapping(value = "/")
public String index(){ return "index";
}
}

templates下html页面

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/user/registerUser" method="post">
用户名:<input type="text" id="username" name="username"/><br>
密码:<input type="password" id="password" name="password"/><br>
邮箱:<input type="email" id="email" name="useremail"><br>
<input type="submit" value="注册">
</form>
<a href="/user/loginPage">登录</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/user/loginUser" method="post">
用户名:<input type="text" id="username" name="username"/><br>
密码:<input type="password" id="password" name="password"/><br>
<input type="submit" value="登录">
</form>
</body>
</html>

success.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册成功</title>
</head>
<body>
前往邮箱激活账户
</body>
</html>

welcome.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎</title>
</head>
<body>
登录成功
</body>
</html>

SpringBoot实现网站注册,邮件激活码激活功能的更多相关文章

  1. pycharm 激活码激活

    http://idea.lanyus.com/ 去这个网站获取激活码,输入即可,亲测可用

  2. IntelliJ IDEA 2019.2.1 破解教程, 最新激活码(激活到2089年8月,亲测有效,持续更新中...)

    当前最新版本 IDEA 2019.2.1 本来笔者这边是有个正版激活码可以使用的,但是,2019.9月3号的时候,一些小伙伴反映这个注册码已经失效了,于是拿着自己的 IDEA, 赶快测试了一下,果不其 ...

  3. pyCharm专业版最新2018激活码激活

    说明:本人亲测有用,对Window.Linux.Mac都稳定有效. 缺点:需要修改hosts文件 步骤: 由于管理权限问题,大部分电脑都不能直接修改hosts文件,所以我们可以先将hosts文件复制到 ...

  4. Navicat Premium v12.0.23.0 安装,使用激活码激活

    1 下载 可以直接官网下载安装包,也可以直接到我的云盘下载 下载地址:https://pan.baidu.com/s/1apwU9cIKBTr-z0CuJEJ9gg 文件包中包含下面的文件: 2 安装 ...

  5. springboot ---> spring ioc 注册流程 源码解析 this.prepareContext 部分

    现在都是在springboot 中 集成 spirng,那我们就从springboot 开始. 一:springboot 启动main 函数 public static void main(Strin ...

  6. IDEA激活码(2019)

    如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 IDEA已然成为我最热爱的一款编辑器,作为一个从Eclipse阵营转过来的coder,确实能感受到IDEA的强大,而我电脑桌面的Eclips ...

  7. PyCharm2019 激活码

    因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!! ...

  8. [转]pyCharm最新2018激活码

    https://blog.csdn.net/u014044812/article/details/78727496 因公司的需求,需要做一个爬取最近上映的电影.列车号.航班号.机场.车站等信息,所以需 ...

  9. Pycharm 激活码(转) 有效期到2019/10月

    Pycharm 激活码(转) 有效期到2019/10月 2018年11月13日 17:15:32 may_ths 阅读数:64   [激活码激活] 修改hosts文件 添加下面一行到hosts文件,目 ...

随机推荐

  1. cocos代码研究(14)Widget子类Button学习笔记

    理论基础 表示一个按钮组件. 按钮可以被按下,或者点击, 并且在按下或者点击之后,可以由用户指定一个动作来执行,继承自 Widget. 代码部分 static Button * create ()创建 ...

  2. 算法第四版 在Linux 中调用Algs4库

    一: 搭建Java 环境   : 确认版本: 1.8及以上 [username:~/] javac -version javac 1.8.0_111 [username:~/] java -versi ...

  3. 【android】开发中遇到的一些问题

    1:华为输入法,输入框为ACTION_DONE模式,ActionId是 UNSPECIFIED EditText对象.setImeOptions(EditorInfo.IME_ACTION_DONE) ...

  4. flask nginx+uwsgi超时设置

    最近使用uwsgi+nginx经常程序执行一般就跳转到nginx报错页面,查看停止时程序日志还在写,nginx报错upstream timeout排查怀疑是超时的问题 设置nginx uwsgi_co ...

  5. sqlite的事务和锁,很透彻的讲解 【转】

    原文:sqlite的事务和锁 http://3y.uu456.com/bp-877d38906bec097sf46se240-1.html 事务 事务定义了一组SQL命令的边界,这组命令或者作为一个整 ...

  6. LoRa无线通信设计(一)原理

    LoRa无线通信设计(一)原理 引言 1901年,古列尔默.马可尼把长波无线电信号从Cornwall(康沃尔,位于英国的西南部)跨过大西洋传送到3200公里之外的Newfoundland(加拿大的纽芬 ...

  7. Python笔记 #17# Pandas: Merge

    10 Minutes to pandas Concat df = pd.DataFrame(np.random.randn(10, 4)) print(df) # break it into piec ...

  8. 中通快递单api查询

    request POST https://hdgateway.zto.com/WayBill_GetDetail HTTP/1.1Host: hdgateway.zto.comConnection: ...

  9. 实时刷新winform中的某一个控件上的文字

    需要注意的是,必须从UI线程,另外启动一个线程才可以. 在新线程调用异步刷新就OK了 Thread thread; private void button1_Click(object sender, ...

  10. Redis复制(replication)

    介绍 Redis支持简单的主从(master-slave)复制功能,当主Redis服务器更新数据时能将数据同步到从Redis服务器 配置 在Redis中使用复制功能非常容易 在从Redis服务器的re ...