当前位置: 首页 > news >正文

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.lryc.cn/news/547239.html

相关文章:

  • 车载测试:智能座舱测试中多屏联动与语音交互的挑战
  • C/C++输入输出(1)
  • 前端面试场景题葵花宝典之四
  • 探索Elasticsearch:索引的CRUD
  • Java数据结构第十六期:走进二叉树的奇妙世界(五)
  • 【开源免费】基于SpringBoot+Vue.JS疫情管理系统(JAVA毕业设计)
  • 有关Java中的集合(1):List<T>和Set<T>
  • 使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控
  • 在 Apache Tomcat 中,部署和删除项目
  • 宇树科技G1人形机器人:从炫技到实用,AI驱动下的进化跃迁‌
  • 给定计算预算下的最佳LLM模型尺寸与预训练数据量分配
  • H5DS编辑器是如何让企业快速构建动态页面
  • 面试题汇总(一)
  • 论坛系统测试报告
  • 算法比赛中处理输入和输出
  • llama.cpp: GGUF格式及模型量化参数介绍
  • PGlite:浏览器中运行的PostgreSQL
  • 【C++】vector(上):vector的常用接口介绍
  • 【算法】二分查找(上)
  • 【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?
  • linux nginx 安装后,发现SSL模块未安装,如何处理?
  • 蓝桥杯 - 每日打卡(类斐波那契循环数)
  • 深入探索C++17文件系统库:std::filesystem全面解析
  • LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理
  • Unity 适用Canvas 为任一渲染模式的UI 拖拽
  • 基于遗传算法的无人机三维路径规划仿真步骤详解
  • windows下使用Hyper+wsl实现ubuntu下git的平替
  • 基于Java+SpringCloud+Vue的前后端分离的房产销售平台
  • 以影像技术重构智能座舱体验,开启驾乘互动新纪元
  • deepseek在pycharm 中的配置和简单应用