Springboot實(shí)現(xiàn)發(fā)送郵件及注冊激活步驟
在上一篇文章中,我們使用springboot整合郵件實(shí)現(xiàn)發(fā)送功能,那么下面來用郵件發(fā)送功能實(shí)現(xiàn)用戶注冊,方便我們進(jìn)一步熟悉郵件發(fā)送功能的使用。實(shí)現(xiàn)步驟大致如下:進(jìn)行用戶注冊同時發(fā)送一封激活郵件,郵件里面包含一條激活鏈接,點(diǎn)擊鏈接把使用UUIDUtils生產(chǎn)發(fā)送給用戶的郵箱驗(yàn)證碼提交進(jìn)行驗(yàn)證,從而修改用戶的激活狀態(tài),最后返回登陸頁面進(jìn)行驗(yàn)證登錄。
一.效果演示
輸入郵箱等一系列信息,點(diǎn)擊注冊,系統(tǒng)自動發(fā)送激活郵件到你綁定的郵箱地址。同時數(shù)據(jù)庫里面增加一條用戶信息,其中用戶狀態(tài)(status)默認(rèn)值為0,需要進(jìn)行激活改變狀態(tài)才能授權(quán)登錄。

如下,打開自己綁定的郵箱點(diǎn)擊下面的激活鏈接,激活成功后跳轉(zhuǎn)到登錄頁面

點(diǎn)擊郵件激活鏈接的時候,驗(yàn)證鏈接中的激活碼與數(shù)據(jù)庫的code值是否一致,若驗(yàn)證成功則清除數(shù)據(jù)庫中code的值,同時改變用戶狀態(tài)(即status的值由0變?yōu)?)。

二.編程實(shí)現(xiàn)步驟
1.實(shí)現(xiàn)郵件發(fā)送服務(wù)
如何實(shí)現(xiàn)郵件發(fā)送服務(wù),可以參考我之前相關(guān)的文章:Springboot整合實(shí)現(xiàn)郵件發(fā)送
2.封裝實(shí)體類
使用注解的方式快速創(chuàng)建User實(shí)體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int UserID;
//賬號
private String UserNumber;
//密碼
private String Password;
//郵箱地址
private String Email;
/**
* 狀態(tài):0代表未激活,1代表激活
*/
private Integer status;
/**
* 利用UUID生成一段數(shù)字,發(fā)動到用戶郵箱,當(dāng)用戶點(diǎn)擊鏈接時
* 在做一個校驗(yàn)如果用戶傳來的code跟我們發(fā)生的code一致,更改狀態(tài)為“1”來激活用戶
*/
private String code;
}
3.創(chuàng)建生成UUID的工具類
UUID產(chǎn)生的目的是讓分布式系統(tǒng)中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。如此一來,每個人都可以創(chuàng)建不與其它人沖突的UUID。在這樣的情況下,就不需考慮數(shù)據(jù)庫創(chuàng)建時的名稱重復(fù)問題。UUID 來作為數(shù)據(jù)庫中字段是非常不錯的選擇,保證每次生成的UUID 是唯一的
import java.util.UUID;
/**
* @Description:使用UUIDUtils生產(chǎn)發(fā)送給用戶的郵箱驗(yàn)證碼
*/
public class UUIDUtils {
public static String getUUID(){
return UUID.randomUUID().toString().replace("-","");
}
}
4.創(chuàng)建Userdao接口
package com.kuang.Dao;
import com.kuang.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
//@Mapper : 表示本類是一個 MyBatis 的 Mapper
@Mapper
@Repository
public interface UsersDao {
//登錄
public User login(@Param("UserNumber") String UserNumber, @Param("Password") String Password);
//找回密碼
public User retrieve(@Param("Email") String Email);
/**
* 用戶注冊
* @param user
*/
void register(User user);
/**
* 根據(jù)激活碼查詢用戶,之后再進(jìn)行修改用戶狀態(tài)
* @param code
* @return
*/
User checkCode(String code);
/**
* 激活賬戶,修改用戶狀態(tài)為"1"
* @param user
*/
void updateUserStatus(User user);
}
5.創(chuàng)建映射文件UserMapper.xml
注意:在mybatis中映射文件中的namespace是用于綁定Dao接口的,即面向接口編程,dao接口的方法對應(yīng)mapper中的sql語名。
<?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.kuang.Dao.UsersDao">
<resultMap type="com.kuang.pojo.User" id="User">
<id column="UserID" property="UserID"/>
<result column="UserID" property="UserID"/>
<result column="UserNumber" property="UserNumber"/>
<result column="Password" property="Password"/>
<result column="Email" property="Email"/>
<result column="code" property="code"/>
<result column="status" property="status"/>
</resultMap>
<select id="login" resultMap="User">
select * from user where UserNumber=#{UserNumber} and Password=#{Password} and status=1
</select>
<select id="retrieve" resultMap="User">
select * from user where Email=#{Email}
</select>
<!--注冊用戶-->
<insert id="register" parameterType="User" >
insert into user ( UserNumber, Password,Email,status,code)
values (#{UserNumber,jdbcType=VARCHAR}, #{Password,jdbcType=VARCHAR}, #{Email,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER},#{code,jdbcType=INTEGER})
</insert>
<!--根據(jù)激活碼code查詢用戶-->
<select id="checkCode" parameterType="String" resultType="User">
select * from user where code = #[code]
</select>
<!--激活賬戶,修改用戶狀態(tài)-->
<update id="updateUserStatus" parameterType="User">
update user set status=1,code=null where UserID=#{UserID}
</update>
</mapper>
6.創(chuàng)建UserService接口
package com.kuang.service;
import com.kuang.pojo.User;
public interface UserService {
//用戶登錄
public User login(String userName, String password);
//找回密碼
public User retrieve(String email);
/**
* 用戶注冊
* @param user
*/
void register(User user);
/**
* 根據(jù)激活碼code查詢用戶,之后再進(jìn)行修改狀態(tài)
* @param code
* @return
*/
User checkCode(String code);
/**
* 激活賬戶,修改用戶狀態(tài)
* @param user
*/
void updateUserStatus(User user);
}
7.創(chuàng)建UserServiceImpl實(shí)現(xiàn)類
注意:這里使用到的sendHtmlMail發(fā)送郵件方法,在相關(guān)的文章:Springboot整合實(shí)現(xiàn)郵件發(fā)送
package com.kuang.service.impl;
import com.kuang.Dao.UsersDao;
import com.kuang.pojo.User;
import com.kuang.service.MailService;
import com.kuang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UsersDao usersDao;
@Autowired
private MailService mailService;
/**
* 登錄驗(yàn)證
*/
@Override
public User login(String userName, String password){
return usersDao.login(userName,password);
}
/**
* 忘記密碼,郵件發(fā)送找回
*/
@Override
public User retrieve(String email){
return usersDao.retrieve(email);
}
/**
* 用戶注冊,同時發(fā)送一封激活郵件
* @param user
*/
@Override
public void register(User user) {
usersDao.register(user);
String code = user.getCode();
System.out.println("code:"+code);
String subject = "來自智能化駕校管理系統(tǒng)的激活郵件";
///checkCode?code=xxx即是我們點(diǎn)擊郵件鏈接之后進(jìn)行更改狀態(tài)的
String context = "<h1>此郵件為官方激活郵件!請點(diǎn)擊下面鏈接完成激活操作!</h1> <a href=\"http://localhost:8080/selectCode?code="+code+"\">激活請點(diǎn)擊:"+code+"</a> ";
//發(fā)送激活郵件
mailService.sendHtmlMail (user.getEmail(),subject,context);
}
/**
* 根據(jù)激活碼code進(jìn)行查詢用戶,之后再進(jìn)行修改狀態(tài)
* @param code
* @return
*/
@Override
public User checkCode(String code) {
return usersDao.checkCode(code);
}
/**
* 激活賬戶,修改用戶狀態(tài)
* @param user
*/
@Override
public void updateUserStatus(User user) {
usersDao.updateUserStatus(user);
}
}
8.定義核心業(yè)務(wù)接口UserController控制類
package com.kuang.contorller;
import com.kuang.common.UUIDUtils;
import com.kuang.pojo.User;
import com.kuang.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
@Controller
public class LoginContorller {
@Resource
private UserService userService;
@RequestMapping("/main")
public String login(@RequestParam("UserNumber") String UserNumber,
@RequestParam("Password") String Password, Model model, HttpSession session) {
//具體的業(yè)務(wù)
User user= userService.login(UserNumber,Password);
if (user!=null){
session.setAttribute("loginUser",UserNumber);
return "redirect:/Main";
}else if(StringUtils.isEmpty(UserNumber) && StringUtils.isEmpty(Password)){
model.addAttribute("msg","賬號或者密碼不能為空");
return "Login";
}
else {
model.addAttribute("msg","賬號或者密碼錯誤");
return "Login";
}
}
/**
* 注冊
* @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 "login";
}
/**
*校驗(yàn)郵箱中的code激活賬戶
* 首先根據(jù)激活碼code查詢用戶,之后再把狀態(tài)修改為"1"
*/
@RequestMapping(value = "/selectCode")
public String checkCode(String code){
User user = userService.checkCode(code);
System.out.println(user);
//如果用戶不等于null,把用戶狀態(tài)修改status=1
if (user !=null){
user.setStatus(1);
//把code驗(yàn)證碼清空,已經(jīng)不需要了
user.setCode("");
System.out.println(user);
userService.updateUserStatus(user);
}
return "login";
}
/**
* 跳轉(zhuǎn)到登錄頁面
* @return login
*/
@RequestMapping(value = "/loginPage")
public String login(){
return "login";
}
}
9.編寫頁面內(nèi)容
在我們的項(xiàng)目開發(fā)過程中我們需要向后端發(fā)送請求,實(shí)現(xiàn)前后端的數(shù)據(jù)交互,這里使用了Thymeleaf模板引擎+form的方法。后臺按照post的地址進(jìn)行接收即可,需要注意的是,提交數(shù)據(jù)的時候,button或者input都設(shè)置成為submit
<div id="signup-box" class="signup-box widget-box no-border">
<div class="widget-body">
<div class="widget-main">
<h4 class="header green lighter bigger">
<i class="icon-group blue"></i>
<span id="beatText1">注冊新用戶</span>
</h4>
<div class="space-6"></div>
<p> 請輸入你的信息: </p>
<form th:action="@{/registerUser}" method="post">
<fieldset>
<label>
<span class="block input-icon input-icon-right">
<input type="email" class="span12" id="ZCEmail" name="Email" placeholder="郵箱"/>
<i class="icon-envelope"></i>
</span>
</label>
<label>
<span class="block input-icon input-icon-right">
<input type="text" class="span12" id="ZCUserNumber" name="UserNumber" placeholder="賬號"/>
<i class="icon-user"></i>
</span>
</label>
<label>
<span class="block input-icon input-icon-right">
<input type="password" class="span12" id="ZCPassword" name="Password" placeholder="密碼"/>
<i class="icon-lock"></i>
</span>
</label>
<label>
<span class="block input-icon input-icon-right">
<input type="password" class="span12" placeholder="確認(rèn)密碼"/>
<i class="icon-retweet"></i>
</span>
</label>
<label>
<input type="checkbox"/>
<span class="lbl">
我接受本
<a href="#" rel="external nofollow" rel="external nofollow" >用戶協(xié)議</a>
</span>
</label>
<div class="space-24"></div>
<div class="clearfix">
<button type="reset" class="width-30 pull-left btn btn-small">
<i class="icon-refresh"></i>
重置
</button>
<button type="submit" class="width-65 pull-right btn btn-small btn-success">
注冊
<i class="icon-arrow-right icon-on-right"></i>
</button>
</div>
</fieldset>
</form>
</div>
<div class="toolbar center">
<a href="#" rel="external nofollow" rel="external nofollow" onclick="show_box('login-box'); return false;"
class="back-to-login-link">
<i class="icon-arrow-left"></i>
返回登陸
</a>
</div>
10.完整的項(xiàng)目部署

總結(jié):使用Springboot實(shí)現(xiàn)發(fā)送郵件注冊激活的步驟大致如此,需要更加完整的項(xiàng)目邏輯可以自己完善
到此這篇關(guān)于Springboot實(shí)現(xiàn)發(fā)送郵件及注冊激活步驟的文章就介紹到這了,更多相關(guān)Springboot發(fā)送郵件注冊激活內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8新特性O(shè)ptional類及新時間日期API示例詳解
這篇文章主要為大家介紹了Java8新特性O(shè)ptional類及新時間日期API示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java調(diào)用Docx4j庫玩轉(zhuǎn)Word文檔處理
在 Java 開發(fā)里處理 Word 文檔時,Docx4j 可是個超厲害的庫,它能讓咱輕松創(chuàng)建,讀取,修改和轉(zhuǎn)換 Word 文檔,下面我們就來看看具體是如何操作的吧2025-02-02
SpringBoot3使用devtools實(shí)現(xiàn)代碼熱部署的詳細(xì)步驟
Spring Boot DevTools是一組用于提高開發(fā)人員生產(chǎn)力,并加速Spring Boot應(yīng)用程序開發(fā)的工具,它提供了一些功能,可以幫助開發(fā)人員更快速地構(gòu)建應(yīng)用程序,并減少常見的開發(fā)問題,本文給大家介紹了SpringBoot3使用devtools實(shí)現(xiàn)代碼熱部署的詳細(xì)步驟,需要的朋友可以參考下2024-01-01
解析MapStruct轉(zhuǎn)換javaBean時出現(xiàn)的詭異事件
在項(xiàng)目中用到了MapStruct,對其可以轉(zhuǎn)換JavaBean特別好奇,今天小編給大家分享一個demo給大家講解MapStruct轉(zhuǎn)換javaBean時出現(xiàn)的詭異事件,感興趣的朋友一起看看吧2021-09-09
java StringBuilder類的詳解及簡單實(shí)例
這篇文章主要介紹了java StringBuilder類的詳解及簡單實(shí)例的相關(guān)資料,實(shí)現(xiàn)了StringBuilder類的追加、插入、替換、刪除等操作,需要的朋友可以參考下2017-08-08
JAVA簡單鏈接Oracle數(shù)據(jù)庫 注冊和登陸功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了JAVA鏈接Oracle并實(shí)現(xiàn)注冊與登錄功能的代碼實(shí)例,有需要的朋友可以參考一下2014-01-01
IntelliJ?IDEA無公網(wǎng)遠(yuǎn)程Linux服務(wù)器環(huán)境開發(fā)過程(推薦收藏)
下面介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開發(fā)環(huán)境并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開發(fā),感興趣的朋友跟隨小編一起看看吧2023-12-12

