SpringBoot實現網站註冊,郵件激活碼激活功能
項目源碼: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 ##郵箱用戶名 [email protected] ##郵箱密碼(註意:qq郵箱應該使用獨立密碼,去qq郵箱設置裏面獲取) spring.mail.password=ivhkrccrallkbdcf ##編碼格式 spring.mail.default-encoding=UTF-8 ##發送郵件地址 [email protected]
註意:數據庫配置全部改寫成您自己的賬號密碼,數據庫等信息。郵箱配置不明白的可以參考上一篇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實現網站註冊,郵件激活碼激活功能