Spring Boot 3.x 基于 Redis 實現郵箱驗證碼認證

文章目錄

    • 依賴配置
    • 開啟 QQ 郵箱 SMTP 服務
    • 配置文件
    • 代碼實現
      • 驗證碼服務
      • 郵件服務
      • 接口實現
      • 執行流程

依賴配置

<dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Redis 集成依賴  -->  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId>  <version>3.4.2</version>  </dependency>  <dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-pool2</artifactId>  <version>2.11.1</version>  </dependency>  <dependency>  <groupId>io.lettuce</groupId>  <artifactId>lettuce-core</artifactId>  <version>6.3.2.RELEASE</version>  </dependency><!-- 郵件發送支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 驗證碼生成工具 --> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
</dependencies>

開啟 QQ 郵箱 SMTP 服務

  1. 打開瀏覽器,登錄到 QQ 郵箱。
  2. 點擊左上角的齒輪按鈕,進入設置頁面,見下圖:
    QQMailHeader4. 在設置中找到“第三方服務”,激活 IMAP/SMTP(默認為禁用),并生成獨立的 SMTP 授權碼。 MailBoxSetting

配置文件

spring:  data:  redis:  host: your_redis_hostport: your_redis_port # 通常為6379password: your_redis_passwordlettuce:  pool:  max-active: 8 # 最大連接數  max-idle: 8 # 最大空閑連接數  min-idle: 0 # 最小空閑連接數  max-wait: 100 # 連接等待時間  mail:  host: smtp.qq.com  port: 465  username: your_qq_account@qq.compassword: 111 # 輸入 QQ 郵箱的授權碼properties:  mail:  smtp:  ssl:  enable: true  # QQ 郵箱需要開啟 SSLauth: true

代碼實現

驗證碼服務

使用 Redis 緩存驗證碼并實現驗證碼的校驗功能:

@Service  
public class CaptchaService {  @Autowired  private StringRedisTemplate redisTemplate;  /**  * 生成驗證碼  * @param email 目標郵箱  * @return 生成的驗證碼  */  public String generateCaptcha(String email) { // 生成驗證碼  String code = RandomStringUtils.randomNumeric(6);  redisTemplate.opsForValue().set(  "CAPTCHA:" + email,  code,  Duration.ofMinutes(5)  // 驗證碼有效期為5分鐘  );  return code;  }  /**  * 驗證碼校驗  * @param email 郵箱  * @param code 驗證碼  * @return 是否驗證通過  */  public boolean validateCaptcha(String email, String code) {  String captcha = redisTemplate.opsForValue().get("CAPTCHA:" + email);  return captcha != null && captcha.equals(code);  }  
}

郵件服務

@Service  
public class EmailService {  @Autowired  private JavaMailSender mailSender;  /**  * 發送驗證碼郵件  * @param email 收件人郵箱  * @param authCode 驗證碼  */  public void sendCaptchaEmail(String email, String authCode) {  SimpleMailMessage message = new SimpleMailMessage();  message.setFrom("your_qq_account@qq.com");  message.setTo(email);  message.setSubject("驗證碼");  message.setText("您的驗證碼是:" + authCode + ",有效期為5分鐘");  mailSender.send(message);  }
}

接口實現

@RestController  
public class AuthController {  @Autowired  private UserService userService;  @Autowired  private CaptchaService captchaService;  @Autowired  private EmailService emailService;  /**  * 注冊接口  * @param userDTO 用戶信息  * @param captcha 驗證碼  * @return 注冊結果  */  @PostMapping("/register")  public Result register(@RequestBody UserDTO userDTO, @RequestParam String captcha) {  if (!captchaService.validateCaptcha(userDTO.getEmail(), captcha)) {  return Result.error("驗證碼錯誤");  }  userService.register(userDTO);  return Result.success();  }  /**  * 登錄接口  * @param userDTO 用戶信息  * @return 登錄結果  */  @PostMapping("/login")  public Result login(@RequestBody UserDTO userDTO) {  User user = userService.login(userDTO);  if (user == null) {  return Result.error("用戶不存在");  }  // 登錄成功,生成 JWT 令牌  Map<String, Object> claims = new HashMap<>();  claims.put("userId", user.getId());  String token = JwtUtils.createJWT("secretKey", 60000, claims);  UserVO userVO = new UserVO();  BeanUtils.copyProperties(user, userVO);  LoginResponse loginResponse = new LoginResponse(userVO, token);  return Result.success(loginResponse);  }  /**  * 發送驗證碼接口  * @param email 郵箱地址  * @return 發送結果  */  @PostMapping("/send-code")  public Result sendCode(@RequestParam String email) throws MessagingException {  // 校驗郵箱格式if (!RegexUtils.isEmailValid(email)) {  return Result.error("郵箱格式非法");  }  String code = captchaService.generateCaptcha(email);  emailService.sendCaptchaEmail(email, code);  return Result.success();  }  
}

執行流程

  1. 用戶輸入郵箱,調用 /send-code 接口獲取驗證碼。
  2. 用戶填寫驗證碼并調用 /register 接口進行注冊。
  3. 系統校驗驗證碼,驗證成功則注冊,失敗則返回錯誤信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72109.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP的學習

PHP的基礎前提【HTML、CSS】 第一步先進行VS cood的下載&#xff1a;Visual Studio Code - Code Editing. Redefined 【選擇適合自己的電腦的版本eg:我就是64位的win】

XML 編輯器:全面指南與最佳實踐

XML 編輯器:全面指南與最佳實踐 引言 XML(可擴展標記語言)編輯器是處理XML文件的關鍵工具,對于開發人員、系統管理員以及任何需要處理XML數據的人來說至關重要。本文將全面介紹XML編輯器的概念、功能、選擇標準以及最佳實踐,旨在幫助讀者了解如何選擇和使用合適的XML編輯…

《Effective Objective-C》閱讀筆記(下)

目錄 內存管理 理解引用計數 引用計數工作原理 自動釋放池 保留環 以ARC簡化引用計數 使用ARC時必須遵循的方法命名規則 變量的內存管理語義 ARC如何清理實例變量 在dealloc方法中只釋放引用并解除監聽 編寫“異常安全代碼”時留意內存管理問題 以弱引用避免保留環 …

ORM Bee V2.5.2.x 發布,支持 CQRS; sql 性能分析;更新 MongoDB ORM分片

Bee, 一個具有分片功能的 ORM 框架. Bee Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鴻蒙) 小巧玲瓏&#xff01;僅 940K, 還不到 1M, 但卻是功能強大&#xff01; V2.5.2 (2025?LTS 版) 開發中... **2.5.2.1 新年 ** 支持 Mong…

springboot之HTML與圖片生成

背景 后臺需要根據字段動態生成HTML&#xff0c;并生成圖片&#xff0c;發送郵件到給定郵箱 依賴 <!-- freemarker模板引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifa…

《從0到1:用Python在鴻蒙系統開發安防圖像分類AI功能》

在人工智能與移動應用深度融合的當下,類目標簽AI功能成為眾多行業提升效率和用戶體驗的關鍵技術。本文聚焦于HarmonyOS NEXT API 12及以上版本,以圖像分類在智能家居安防領域的應用為例,為開發者詳細闡述如何利用Python開發類目標簽AI功能,助力鴻蒙技術在該領域的創新應用。…

【AD】3-10 原理圖PDF導出

文件—智能PDF 多頁原理圖導出 導出設置時選擇工程&#xff0c;可自行選擇導出一頁或多頁原理圖&#xff0c;一般PCB不用導出

【deepseek第一課】從0到1介紹 采用ollama安裝deepseek私有化部署,并實現頁面可視化

【deepseek第一課】從0到1介紹 采用ollama安裝deepseek私有化部署,并實現頁面可視化 1. ollama安裝1.1 linux安裝1.2 windows安裝2. deepSeek支持的7種蒸餾模型2.1 蒸餾模型介紹2.2 7種模型特點2.3 安裝deepseek-r1:14b模型3. openwebui圖形化頁面安裝4. java連接大模型的三…

【在線用戶監控】在線用戶查詢、強退用戶

文章目錄 在線用戶監控在線用戶監控API(RestController)當前在線會話在線用戶查詢強退用戶知識擴展: JwtJwtTokenUtil生成jwt解析token登錄授權的實現:json web token + redis + springboot在線用戶監控 在線用戶監控API(RestController) @RestController @Tag(name = &qu…

超詳細,多圖文介紹redis集群方式并搭建redis偽集群

超詳細&#xff0c;多圖文介紹redis集群方式并搭建redis偽集群 超多圖文&#xff0c;對新手友好度極好。敲命令的過程中&#xff0c;難免會敲錯&#xff0c;但為了截好一張合適的圖&#xff0c;一旦出現一點問題&#xff0c;為了好的演示效果&#xff0c;就要從頭開始敲。且看且…

Hue Load Balance配置

個人博客地址&#xff1a;Hue Load Balance配置 | 一張假鈔的真實世界 直接上配置&#xff1a; server {server_name 192.168.72.31;listen 8001;charset utf-8;proxy_connect_timeout 600s;proxy_read_timeout 600s;proxy_send_timeout 600s;location / {proxy_set_header H…

992. K 個不同整數的子數組

目錄 一、題目二、思路2.1 解題思路2.2 代碼嘗試2.3 疑難問題 三、解法四、收獲4.1 心得4.2 舉一反三 一、題目 二、思路 2.1 解題思路 2.2 代碼嘗試 class Solution { public:int subarraysWithKDistinct(vector<int>& nums, int k) {//需要有數據結構來存儲數組…

領域驅動設計:事件溯源架構簡介

概述 事件溯源架構通常由3種應用設計模式組成,分別是:事件驅動(Event Driven),事件溯源(Event Source)、CQRS(讀寫分離)。這三種應用設計模式常見于領域驅動設計(DDD)中,但它們本身是一種應用設計的思想,不僅僅局限于DDD,每一種模式都可以單獨拿出來使用。 E…

PT2035 TWS 藍牙耳機雙觸控雙輸出 IC

1. 產品概述 PT2035 是一款支持入耳檢測的藍牙耳機專用觸摸芯片&#xff0c;該芯片具有寬工作電壓、低功耗、高抗 干擾能力的特性。 2. 主要特性 工作電壓范圍&#xff1a; 2.4~5.5V 待機電流約 2.5uAV DD3V/CMOD5nF 入耳有效&#xff0c;無觸摸時工作電流約 8uAV DD3…

AI編程界的集大成者——通義靈碼AI程序員

一、引言 隨著軟件行業的快速發展和技術的進步&#xff0c;人工智能&#xff08;AI&#xff09;正在成為軟件開發領域的一個重要組成部分。近年來&#xff0c;越來越多的AI輔助工具被引入到開發流程中&#xff0c;旨在提高效率、減少錯誤并加速創新。在這樣的背景下&#xff0…

Rocky Linux 8.5 6G內存 靜默模式(沒圖形界面)安裝Oracle 19C

Oracle19c 下載地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目錄 一、準備服務器 1、服務器可以克隆、自己裝 2、修改主機名 3、重啟 4、關閉selinux 5、關閉防火墻 5.1、…

另辟蹊徑:多維度解析 STM32 微控制器

開篇&#xff1a;STM32 的廣泛影響力 在嵌入式系統的廣闊天地中&#xff0c;STM32 系列微控制器宛如一顆璀璨的明星&#xff0c;散發著耀眼的光芒。它憑借出色的性能、豐富的資源以及高性價比&#xff0c;在工業、醫療、消費電子等眾多領域廣泛應用&#xff0c;成為無數開發者…

DeepSeek 使用竅門與提示詞寫法指南

一、通用提示詞技巧 竅門分類技巧說明示例提示詞明確需求用“角色任務要求”明確目標作為健身教練&#xff0c;為30歲上班族設計一周減脂計劃&#xff0c;需包含飲食和15分鐘居家訓練結構化提問分步驟、分模塊提問第一步&#xff1a;列出Python爬蟲必備的5個庫&#xff1b;第二…

全監督、半監督、弱監督、無監督

全監督、半監督、弱監督、無監督 全監督學習&#xff08;Fully Supervised Learning&#xff09; 數據標注&#xff1a;使用的數據集包含大量的輸入數據&#xff08;特征&#xff09;以及與之對應的準確標注信息&#xff08;標簽&#xff09;。學習目標&#xff1a;通過學習輸…

c#實現485協議

在C#中實現RS-485協議通信,需要結合串口(SerialPort)操作和硬件收發控制(如RTS信號切換)。以下是詳細的步驟和示例代碼: 1. RS-485通信原理 物理層:RS-485是差分信號標準,支持多點通信(半雙工)。 收發控制:通過控制RTS(Request to Send)或DTR引腳切換發送/接收模式…