首頁 Java java教程 java完成郵件註冊功能的實例詳解

java完成郵件註冊功能的實例詳解

May 12, 2017 am 09:32 AM
boot java spring

本篇文章主要介紹了Spring Boot實現郵件註冊功能範例程式碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

註冊流程

1.[前端] 使用者在註冊頁面提交註冊資訊;

2.[後端] 校驗使用者提交的參數,有誤直接回傳錯誤訊息,無誤向下執行;

3.[後端] 隨機產生一個ID,將ID當作key,使用者資訊當作value,存入redis,設定時長;

4.[後端] 產生激活鏈接,透過郵件系統發送郵件到用戶郵箱

5.[前端] 用戶點擊上圖的「確認註冊」;

6.[後端] 校驗value是否過期,校驗郵箱是否已經註冊,沒有則保存使用者資訊到資料庫,提示使用者已經註冊成功;

功能實作(逆向分析)

1、先看看郵件發送的實作cn.ictgu.tools.mail.MailService

package cn.ictgu.tools.mail;

import cn.ictgu.dao.model.User;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.log4j.Log4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 邮件服务
 * Created by Silence on 2017/3/11.
 */
@Service
@Log4j
public class MailService {

 @Autowired
 private JavaMailSender mailSender;

 @Value("${spring.mail.username}")
 private String from;

 private static final String TITLE_SIGN_UP = "[邮件标题]";

 private static final String CONTENT = "[邮件内容]";

 public void userValidate(User user, String token){
 MimeMessage mailMessage = mailSender.createMimeMessage();
 try {
  MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "GBK");
  helper.setFrom(from);
  helper.setTo(user.getEmail());
  helper.setSubject(TITLE_SIGN_UP);
  String link = "http://www.ictgu.cn/validate/" + token;
  String message = String.format(CONTENT, user.getNickname(), link, link, user.getEmail());
  helper.setText(message, true);
  mailSender.send(mailMessage);
 } catch (MessagingException e) {
  log.error("发送邮件失败:User:" + JSONObject.toJSONString(user) + ", Token: " + token);
 }

 }
登入後複製

說明:發送郵件需要傳入2個參數user 和token,user即為用戶註冊訊息,token是一個隨機的UUID,redis中有與之對應的key,其value是user的json字串。 (key的規則是設定檔redis.prefix.signUp + UUID)

#郵件範本問題:

郵件內容的本質是一段字串,樣式由html+css控制,開發時,在郵箱設計好模板,變數用%s代替,然後將整段字串存放在一個合適的地方,發送郵件時,使用String.format()方法將%s替換為實際值,就產生了最終使用者看到郵件。所以沒有必要使用第三方模板,加入jar包會增加系統的複雜度,同樣的功能,能簡化的盡量簡化。

2、如何產生Token呢? 請看 cn.ictgu.redis.RedisTokenManager

 public String getTokenOfSignUp(User user){
 String token = UUID.randomUUID().toString();
 String value = JSONObject.toJSONString(user);
 stringRedisTemplate.opsForValue().set(signUpPrefix + token, value);
 stringRedisTemplate.expire(signUpPrefix + token, 12, TimeUnit.HOURS);
 return token;
 }
登入後複製

說明:UUID.randomUUID().toString()是javaJDK提供的一個自動產生主鍵的方法。 UUID(Universally Unique Identifier)全域唯一識別碼,是指在一台機器上產生的數字,它保證對在同一時空中的所有機器都是唯一的,是由一個十六位的數字組成,表現出來的形式。由以下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又產生一個UUID,則第一個部分不同,其餘相同),時鐘序列,全域唯一的IEEE機器識別號碼(如果有網路卡,從網路卡取得,沒有網路卡以其他方式取得),UUID的唯一缺陷在於產生的結果串會比較長。

3、token有了,就需要在service層關聯user和token發送郵件啦,看看cn.ictgu.dao.service.UserService

 public boolean signUp(User user){
 String email = user.getEmail();
 if (existEmail(email)){
  log.error("用户注册,邮箱已注册:" + email);
  return false;
 }
 sendValidateEmail(user);
 return true;
 }

 @Async
 private void sendValidateEmail(User user){
 String token = tokenManager.getTokenOfSignUp(user);
 log.error("用户注册,准备发送邮件:User:" + JSONObject.toJSONString(user) + ", Token: " + token);
 mailService.userValidate(user, token);
 }

 private boolean existEmail(String email){
 return mapper.selectByEmail(email) != null;
 }
登入後複製

說明:發送郵件耗時較長,使用非同步來做,提高使用者體驗

4、user就簡單了

@RestController
public class UserApi {

 @Autowired
 private UserService userService;

 @RequestMapping(value = "/sign-up", method = RequestMethod.POST)
 public SimpleResponse signUp(HttpServletRequest request){
 User user = createUser(request);
 SimpleResponse response = checkSignUpRequest(user);
 if (response.getCode() == 100){
  if (!userService.signUp(user)){
  response.setCode(200);
  response.setMessage("此邮箱已注册,请勿重复注册!");
  return response;
  }else {
  response.setMessage("注册激活邮件已发送至您邮箱,请在12小时内激活完成注册!");
  return response;
  }
 }
 return response;
 }

 private SimpleResponse checkSignUpRequest(User user){
 SimpleResponse response = new SimpleResponse();
 String email = user.getEmail();
 if (!CheckUtils.checkEmail(email)){
  response.setCode(200);
  response.setMessage("邮箱格式不合法");
  return response;
 }
 String password = user.getPassword();
 if (!CheckUtils.checkPassword(password)){
  response.setCode(200);
  response.setMessage("密码长度必须为8-16位,且必须包含数字和字母");
  return response;
 }
 String nickname = user.getNickname();
 if (!CheckUtils.checkNickname(nickname)){
  response.setCode(200);
  response.setMessage("昵称长度不合法");
  return response;
 }
 response.setCode(100);
 return response;
 }

}
登入後複製

說明:這一層主要做了使用者註冊參數的校驗

效果圖

回顧

#從下往上看,從用戶註冊到郵件發送就實現了,大部分程式碼都是做的參數校驗,因為使用者行為是不可信的,要建構安全的後台系統,就要無死角的校驗校驗。 。 。 。

【相關推薦】

1. Java免費影片教學

#2. YMP線上手冊

3. JAVA初級入門影片教學

以上是java完成郵件註冊功能的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的平方根 Java 中的平方根 Aug 30, 2024 pm 04:26 PM

Java 中的平方根

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 中的完美數

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 中的隨機數產生器

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java中的Weka

Java 中的阿姆斯壯數 Java 中的阿姆斯壯數 Aug 30, 2024 pm 04:26 PM

Java 中的阿姆斯壯數

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 中的史密斯數

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

Java Spring 面試題

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

突破或從Java 8流返回?

See all articles