本篇文章主要介紹了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中文網其他相關文章!

java实现定时任务Jdk自带的库中,有两种方式可以实现定时任务,一种是Timer,另一种是ScheduledThreadPoolExecutor。Timer+TimerTask创建一个Timer就创建了一个线程,可以用来调度TimerTask任务Timer有四个构造方法,可以指定Timer线程的名字以及是否设置为为守护线程。默认名字Timer-编号,默认不是守护线程。主要有三个比较重要的方法:cancel():终止任务调度,取消当前调度的所有任务,正在运行的任务不受影响purge():从任务队

一、@RequestParam注解对应的axios传参方法以下面的这段Springjava代码为例,接口使用POST协议,需要接受的参数分别是tsCode、indexCols、table。针对这个Spring的HTTP接口,axios该如何传参?有几种方法?我们来一一介绍。@PostMapping("/line")publicList

SpringBoot和SpringCloud都是SpringFramework的扩展,它们可以帮助开发人员更快地构建和部署微服务应用程序,但它们各自有不同的用途和功能。SpringBoot是一个快速构建Java应用的框架,使得开发人员可以更快地创建和部署基于Spring的应用程序。它提供了一个简单、易于理解的方式来构建独立的、可执行的Spring应用

随着技术的更新迭代,Java5.0开始支持注解。而作为java中的领军框架spring,自从更新了2.5版本之后也开始慢慢舍弃xml配置,更多使用注解来控制spring框架。

作为一名Java开发者,学习和使用Spring框架已经是一项必不可少的技能。而随着云计算和微服务的盛行,学习和使用SpringCloud成为了另一个必须要掌握的技能。SpringCloud是一个基于SpringBoot的用于快速构建分布式系统的开发工具集。它为开发者提供了一系列的组件,包括服务注册与发现、配置中心、负载均衡和断路器等,使得开发者在构建微

1.Spring项目的创建1.1创建Maven项目第一步,创建Maven项目,Spring也是基于Maven的。1.2添加spring依赖第二步,在Maven项目中添加Spring的支持(spring-context,spring-beans)在pom.xml文件添加依赖项。org.springframeworkspring-context5.2.3.RELEASEorg.springframeworkspring-beans5.2.3.RELEASE刷新等待加载完成。1.3创建启动类第三步,创

SpringBean的生命周期管理一、SpringBean的生命周期通过以下方式来指定Bean的初始化和销毁方法,当Bean为单例时,Bean归Spring容器管理,Spring容器关闭,就会调用Bean的销毁方法当Bean为多例时,Bean不归Spring容器管理,Spring容器关闭,不会调用Bean的销毁方法二、通过@Bean的参数(initMethod,destroyMethod)指定Bean的初始化和销毁方法1、项目结构2、PersonpublicclassPerson{publicP

spring设计模式有:1、依赖注入和控制反转;2、工厂模式;3、模板模式;4、观察者模式;5、装饰者模式;6、单例模式;7、策略模式和适配器模式等。详细介绍:1、依赖注入和控制反转: 这两个设计模式是Spring框架的核心。通过依赖注入,Spring负责管理和注入组件之间的依赖关系,降低了组件之间的耦合度。控制反转则是指将对象的创建和依赖关系的管理交给Spring容器等等。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

禪工作室 13.0.1
強大的PHP整合開發環境