Spring Boot 3.x 基于 Redis 实现邮箱验证码认证

news2025/4/21 14:41:29

文章目录

    • 依赖配置
    • 开启 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_host
      port: your_redis_port # 通常为6379
      password: your_redis_password
      lettuce:  
        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.com
    password: 111 # 输入 QQ 邮箱的授权码
    properties:  
      mail:  
        smtp:  
          ssl:  
            enable: true  # QQ 邮箱需要开启 SSL
          auth: 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.coloradmin.cn/o/2308559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL10 物理流复制实战:构建高可用数据库架构!

背景 PostgreSQL 10 在高可用架构中提供了物理复制&#xff0c;也称为流复制&#xff08;Streaming Replication&#xff09;&#xff0c;用于实现实例级别的数据同步。PostgreSQL 复制机制主要包括物理复制和逻辑复制&#xff1a;物理复制依赖 WAL 日志进行物理块级别的同步&…

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…

奔图Pantum M7165DN黑白激光打印一体机报数据清除中…维修

故障描述: 一台奔图Pantum M7165DN黑白激光打印一体机开机自检正常,自检过后就不能工作了,按键面板无任何反应一直提示数据清除中…,如果快速操作的话也能按出菜单、功能啥的,不过一会又死机了,故障请看下图: 故障检修: 经分析可能是主板数据出现了问题,看看能不能快速…

TP-LINK路由器如何设置网段、网关和DHCP服务

目标 ①将路由器的网段由192.168.1.XXX改为192.168.5.XXX ②确认DHCP是启用的&#xff0c;并将DHCP的IP池的范围设置为排除自己要手动指定的IP地址&#xff0c;避免IP冲突。 01-复位路由器 路由器按住复位键10秒以上进行重置操作 02-进入路由器管理界面 电脑连接到路由器&…

神经网络代码入门解析

神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…

TCP/IP 5层协议簇:网络层(IP数据包的格式、路由器原理)

目录 1. TCP/IP 5层协议簇 2. IP 三层包头协议 3. 路由器原理 4. 交换机和路由的对比 1. TCP/IP 5层协议簇 如下&#xff1a; 2. IP 三层包头协议 数据包如下&#xff1a;IP包头不是固定的&#xff0c;每一个数字是一个bit 其中数据部分是上层的内容&#xff0c;IP包头最…

echarts柱状图不是完全铺满容器,左右两边有空白

目录 处理前&#xff1a;echarts柱状图不是完全铺满容器&#xff0c;左右两边有空白处理前&#xff1a;通过调整 grid 组件配置处理后效果修改代码&#xff1a;1. 调整 grid 组件配置原理解决办法 2. 处理 xAxis 的 boundaryGap 属性原理解决办法 3. 调整 barMaxWidth 和 barMi…

ArcGIS Pro技巧实战:高效矢量化天地图地表覆盖图

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;地表覆盖图的矢量化是一项至关重要的任务。天地图作为中国国家级的地理信息服务平台&#xff0c;提供了丰富且详尽的地表覆盖数据。然而&#xff0c;这些数据通常以栅格格式存在&#xff0c;不利于进行空间分析和数据…

西门子S7-1200比较指令

西门子S7-1200 PLC比较指令学习笔记 一、比较指令的作用 核心功能&#xff1a;用于比较两个数值的大小或相等性&#xff0c;结果为布尔值&#xff08;True/False&#xff09;。典型应用&#xff1a; 触发条件控制&#xff08;如温度超过阈值启动报警&#xff09;数据筛选&…

【AD】3-6 层次原理图

自上而下 1.放置-页面符号&#xff0c;并设置属性 2.放置-端口 可通过如下设置将自动生成关掉 3.放置-添加图纸入口&#xff0c;并创建图纸 自下而上 1.子图的原理图页设计 设计资原理图&#xff0c;复制网络标签&#xff0c;智能粘贴未PORT 2.新建主图原理图 创建框…

精品整理-2025 DeepSeek核心技术解析与实践资料合集(24份)

2025 DeepSeek核心技术解析与实践资料合集&#xff0c;共24份。 2025 DeepSeek 火爆背后的核心技术&#xff1a;知识蒸馏技术.pdf 2025 DeepSeek-R1详细解读&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1分析.pdf 2025 DeepSeek-V3三个关键模块详细解读&#xff1a;MLAMoEMTP.pd…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文&#xff1a;https://arxiv.org/pdf/2312.16084 代码&#xff1a;https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询&#xff08;Open-voca…

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案 一、前言 目前应用上架华为AGC平台&#xff0c;都会被要求适配折叠屏设备。目前华为系列的折叠屏手机&#xff0c;有华为 Mate系列&#xff08;左右折叠&#xff0c;华为 Mate XT三折叠&#xff09;&#xff0c;华为Pocket 系列…

数据库基础二(数据库安装配置)

打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是&#xff1a; 1&#xff1a;安装所有 MySQL 数据库需要的产品&#xff1b; 2&#xff1a;仅使用 MySQL 数据库的服务器&#xff1b; 3&a…

HumanPro逼真角色皮肤面部动画Blender插件V1.1版

https://www.youtube.com/watch?vnmV_jzgpIPM 本插件是关于HumanPro逼真角色皮肤面部动画Blender插件V1.1版&#xff0c;大小&#xff1a;2.9 MB&#xff0c;支持Blender 4.0 - 4.3版软件&#xff0c;支持Win系统&#xff0c;语言&#xff1a;英语。RRCG分享 HumanPro 是一款…

基于javaweb的SSM+Maven幼儿园管理系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

PyTorch内存优化的10种策略总结:在有限资源环境下高效训练模型

在大规模深度学习模型训练过程中&#xff0c;GPU内存容量往往成为制约因素&#xff0c;尤其是在训练大型语言模型(LLM)和视觉Transformer等现代架构时。由于大多数研究者和开发者无法使用配备海量GPU内存的高端计算集群&#xff0c;因此掌握有效的内存优化技术变得尤为关键。本…

【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)

第二届边缘计算与并行、分布式计算国际学术会议&#xff08;ECPDC 2025&#xff09;将于2025年4月11日至13日在中国武汉盛大召开。本次会议旨在为边缘计算、并行计算及分布式计算领域的研究人员、学者和行业专家提供一个高水平的学术交流平台。 随着物联网、云计算和大数据技术…

硬件工程师入门教程

1.欧姆定律 测电压并联使用万用表测电流串联使用万用表&#xff0c;红入黑出 2.电阻的阻值识别 直插电阻 贴片电阻 3.电阻的功率 4.电阻的限流作用 限流电阻阻值的计算 单位换算关系 5.电阻的分流功能 6.电阻的分压功能 7.电容 电容简单来说是两块不连通的导体加上中间的绝…

性能测试监控工具jmeter+grafana

1、什么是性能测试监控体系&#xff1f; 为什么要有监控体系&#xff1f; 原因&#xff1a; 1、项目-日益复杂&#xff08;内部除了代码外&#xff0c;还有中间件&#xff0c;数据库&#xff09; 2、一个系统&#xff0c;背后可能有多个软/硬件组合支撑&#xff0c;影响性能的因…