使用Spring Boot和Redis实现邮箱注册与登录的验证码验证

引言

在现代web应用中,邮箱注册和登录是一种常见的用户验证方式。为了增强安全性和便捷性,我们可以利用Redis缓存存储验证码及其过期时间。本文将展示如何使用Spring Boot和Redis来实现邮箱验证码的注册与登录功能。

环境准备

1. 创建Spring Boot项目

首先,你需要创建一个Spring Boot项目,并配置必要的依赖。你可以使用Spring Initializr或编辑pom.xml文件。

pom.xml
<!-- 邮件发送 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2. 配置文件

application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCusername: your_usernamepassword: your_passworddata:redis:host: localhostport: 6379password: your_passwordmail:host: smtp.qq.comport: 465username: your_email@qq.compassword: your_smtp_passwordproperties:mail:smtp:auth: truestarttls:enable: truessl:enable: true

3. 创建Redis配置类

RedisConfig.java
package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}

4. 创建用户实体类

User.java
package com.example.demo.entity;import lombok.Data;import javax.persistence.*;@Data
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String email;@Column(nullable = false)private String password;
}

5. 编写用户服务类

UserService.java
package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.Random;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate JavaMailSender mailSender;@Autowiredprivate BCryptPasswordEncoder passwordEncoder;private static final String REDIS_KEY_PREFIX = "email:verification:";public void sendVerificationCode(String email) {String code = generateVerificationCode();redisTemplate.opsForValue().set(REDIS_KEY_PREFIX + email, code, 10, TimeUnit.MINUTES);// 发送邮件SimpleMailMessage message = new SimpleMailMessage();message.setFrom("your_email@qq.com");message.setTo(email);message.setSubject("邮箱验证码");message.setText("您的验证码是:" + code + ",有效期为10分钟。");mailSender.send(message);}public boolean verifyCode(String email, String code) {String redisCode = (String) redisTemplate.opsForValue().get(REDIS_KEY_PREFIX + email);return code.equals(redisCode);}public User registerUser(User user) {user.setPassword(passwordEncoder.encode(user.getPassword()));return userRepository.save(user);}private String generateVerificationCode() {Random random = new Random();return String.format("%06d", random.nextInt(999999));}
}

6,总结

核心代码

@Resource
JavaMailSender javaMailSender; /*** 发送邮件** @param email*/public void sendVerificationCode(String email) {// 1.构建邮件对象SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom("1789714718@qq.com"); // 发送方simpleMailMessage.setTo(email); // 接收方simpleMailMessage.setSubject("【沙琪马】登录邮箱验证"); // 标题String code = RandomUtil.randomNumbers(4);// 随机一个 4位长度的验证码// 2.将验证码保存到redis中redisTemplate.opsForValue().set(REDIS_KEY_PREFIX + email, code, 10, TimeUnit.MINUTES);simpleMailMessage.setSentDate(new Date()); // 设置发送时间simpleMailMessage.setText("您本次邮箱登录的验证码是:" + code + ",有效时间为五分钟.请妥善保管,切勿泄露."); // 内容// 3.发送邮件javaMailSender.send(simpleMailMessage);log.info("邮件:" + email + ",发送成功");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31560.shtml

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

相关文章

34.构建核心注入代码

上一个内容&#xff1a;33.获取入口点 以 33.获取入口点 它的代码为基础进行修改 实现的功能是把LoadLibrary函数注入到目标进程实现加载我们的模块。LoadLibrary只有有程序使用过了它的代码就会加载到内存中&#xff08;因为动态链接库是内存加载&#xff09;就是a程序要用L…

大数据-数据分析师利用excel绘图

你会用excel&#xff0c;统计数据吗&#xff1f;我是大数据工程师&#xff0c;但是我不会excel。那咋办&#xff1f; 用sql&#xff0c;统计&#xff0c;导出到excel&#xff0c;在用excel统计。本文主要讨论的是导出到excel后&#xff0c;画图。 图是什么&#xff1f; x和y…

【学习笔记】Mybatis-Plus(二) :常用注解

常用注解 注解含义应用场景TableName表名注解&#xff0c;标识实体类对应的表表名和实体类名称不一致TableId主键注解&#xff0c;标识实体类的主键主键需要指定自增长TableField字段注解数据库名称和字段名称不一致TableLogic逻辑删除不是真正物理删除数据KeySequence序列主键…

Ilya出走记:SSI的超级安全革命

图片&#xff5c;OpenAI官网 ©自象限原创 作者丨罗辑、程心 和OpenAI分道扬镳以后&#xff0c;Ilya“神秘而伟大”的事业终于揭开了面纱。 6月20日&#xff0c;前OpenAI核心创始人 Ilya Stuskever&#xff0c;在官宣离职一个月后&#xff0c;Ilya在社交媒体平台公开了…

由浅入深,走进深度学习(3)

今天分享的学习内容主要是完整构建神经网络&#xff0c; 包括&#xff1a;训练、测试、损失函数呀&#xff0c;计算精度呀&#xff0c;等等~ 用到的框架就是torch 在这里我也是对自己做一个学习记录&#xff0c;如果不符合大家的口味&#xff0c;大家划走就可以啦 可能没有…

掌握现代C++的模板元编程类型检测技术

最近写代码恰好用到了C模板元编程的类型检测能力&#xff0c;以前对其原理有个大概的印象&#xff0c;但随着C11/C17等新特性的加入&#xff0c;很多做法和以前不同了&#xff0c;借此机会重新梳理一下这方面的知识点。 void_t 的引入 在 C17 之前&#xff0c;模板编程中通常…

利氪科技拿下C轮超级融资,国产智能底盘黑马奔向黄金时代

“智能驾驶遗珠&#xff0c;国产替代富矿。” 这是海通证券在最近一期研报中&#xff0c;描述线控底盘产业的用语。它很巧妙地点明了&#xff0c;这个藏在车身之下的部分&#xff0c;拥有何种特征——稳坐技术体系的核心点位&#xff0c;拥有前景广阔的市场。 事实上&#xf…

mysql、mariadb 登录主机的含义,如何修改登录主机,如何删除登录主机

MariaDB版本: 10.3.39 登录主机的含义&#xff1a; 参考 1 阿风说事&#xff1a;说世间百态、聊奇闻趣事&#xff0c;分享个人观点和独到见解 2 mysql授权localhost&%区别及一直授权错误解决办法&#xff08;安装openstack有感&#xff09; 3 ERROR 1396 (HY000): Operat…

为什么要学习PMP

学习PMP&#xff08;项目管理专业人士认证&#xff09;能够在职场竞争力、薪资待遇、项目管理技能等方面带来显著的提升。以下是学习PMP的具体分析&#xff1a; 1、职场竞争力 升职加薪&#xff1a;学习PMP能够提升个人在项目中的管理能力和解决问题的能力&#xff0c;从而在…

一问搞懂Linux信号【上】

Linux信号在Linux系统中的地位仅此于进程间通信&#xff0c;其重要程度不言而喻。本文我们将从信号产生&#xff0c;信号保存&#xff0c;信号处理三个方面来讲解信号。 &#x1f6a9;结合现实认识信号 在讲解信号产生之前&#xff0c;我们先做些预备的工作。 现实生活中信号…

vue3-openlayers 轨迹回放(历史轨迹),实时轨迹

vue3-openlayers 轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;实时轨迹 本篇介绍一下使用vue3-openlayers轨迹回放&#xff08;历史轨迹&#xff09;&#xff0c;实时轨迹 1 需求 轨迹回放&#xff08;历史轨迹&#xff09;实时轨迹 2 分析 可以使用和上一篇相同…

编译原理-各章典型题型+思路求解

第2章文法和语言习题 基础知识&#xff1a; 思路&#xff1a; 基础知识&#xff1a; 思路&#xff1a; 基础知识&#xff1a; 编译原理之 短语&直接短语&句柄 定义与区分_编译原理短语,直接短语,句柄-CSDN博客 思路&#xff1a; 题目&#xff1a; 基础解释&#xff1a…

【PID _stm32 教程】

【PID电机速度闭环控制-PID算法(章节:8.3-PID算法初步体验与算法理解)】 https://www.bilibili.com/video/BV1q341197kn

关于使用tensorflow_gpu遇到的问题

前言 我使用的是tensorflow_gpu2.6与python3.9&#xff0c;还要下载cuda与cudnn。 numpy版本问题 AttributeError: module numpy has no attribute object. np.object was a deprecated alias for the builtin object. To avoid this error in existing code, use object by i…

一种快速设计PCB外壳的方法

设计PCB外壳比较好用的工具是SW但是有时候需要快速设计外壳的情况下使用立创EDA的外壳设计功能很好用&#xff0c;设计完成之后可以直接导出STL文件&#xff1a; 可以看到设计的外壳还是蛮精美的&#xff1a; 特别注意&#xff0c;设计外壳的时候要考虑如何把PCB放进壳子中&…

[Day 17] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在金融業的應用 前言 區塊鏈技術作為一種去中心化的分佈式賬本技術&#xff0c;自其誕生以來便展示出極大的潛力&#xff0c;特別是在金融領域。區塊鏈技術可以通過提供透明性、安全性和效率來改變金融業的運作方式。在本文中&#xff0c;我們將深入探討區塊鏈在金融業…

【文心智能体大赛】迎接属于你的休闲娱乐导师!

迎接属于你的休闲娱乐导师&#xff01; 前言创建智能体发布智能体最后结语 前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&…

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…

EulerOS 安装docker 拉取opengauss 、redis镜像

#下载docker包 wget https://download.docker.com/linux/static/stable/x86_64/docker-18.09.9.tgz #解压 tar zxf docker-18.09.9.tgz #移动解压后的文件夹到/usr/bin mv docker/* /usr/bin #写入docker.service cat >/usr/lib/systemd/system/docker.service <<E…

通过 Setapp 使用 240 多款 Mac 生产力工具以及 GPT-4o

Setapp 是一项革命性的订阅服务&#xff0c;可以使用 240 多款 Mac 应用程序的综合套件&#xff0c;并配有强大的人工智能助手。 通过 Setapp 为你的工作效率和生产力增添魔力。 Setapp 官网&#xff1a;访问&#xff08;提供 7 天试用&#xff09; Setapp 的主要功能 AI 助手…