springBoot实现发送邮箱验证码 redis缓存源码
要在Spring Boot中实现发送邮箱验证码并使用Redis进行缓存,你需要遵循几个步骤。以下是一个简化的示例,展示了如何整合这些功能:
- 添加依赖
首先,确保你的pom.xml(Maven)或build.gradle(Gradle)中包含了Spring Boot的邮件支持、Redis支持和相关的starter依赖。
对于Maven,你可以添加如下依赖:
xml复制代码
<!-- Spring Boot Mail Starter --> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-mail</artifactId> | |
</dependency> | |
<!-- Spring Boot Data Redis Starter --> | |
<dependency> | |
<groupId>org.springframework.boot</groupId> | |
<artifactId>spring-boot-starter-data-redis</artifactId> | |
</dependency> | |
<!-- 如果使用Lettuce作为Redis客户端,可以添加此依赖(默认可能是Jedis) --> | |
<dependency> | |
<groupId>io.lettuce.core</groupId> | |
<artifactId>lettuce-core</artifactId> | |
<version>你的lettuce版本</version> | |
</dependency> |
- 配置邮件和Redis
在application.properties或application.yml中配置你的邮件服务(SMTP)和Redis连接。
yml复制代码
# application.yml | |
spring: | |
mail: | |
host: smtp.example.com | |
port: 587 | |
username: your-email@example.com | |
password: your-password | |
properties: | |
mail: | |
smtp: | |
auth: true | |
starttls: | |
enable: true | |
redis: | |
host: localhost | |
port: 6379 | |
password: your-redis-password # 如果有的话 |
- 发送邮件服务
创建一个服务来发送包含验证码的邮件。
java复制代码
@Service | |
public class EmailService { | |
@Autowired | |
private JavaMailSender mailSender; | |
public void sendVerificationEmail(String to, String code) { | |
SimpleMailMessage message = new SimpleMailMessage(); | |
message.setTo(to); | |
message.setFrom("your-email@example.com"); | |
message.setSubject("Verification Code"); | |
message.setText("Your verification code is: " + code); | |
mailSender.send(message); | |
} | |
} |
- Redis服务
创建一个服务来使用Redis缓存验证码。
java复制代码
@Service | |
public class VerificationCodeService { | |
@Autowired | |
private StringRedisTemplate redisTemplate; | |
private static final String CODE_PREFIX = "verification:code:"; | |
private static final Long EXPIRE_TIME = 10L * 60; // 10 minutes in seconds | |
public void saveVerificationCode(String email, String code) { | |
redisTemplate.opsForValue().set(CODE_PREFIX + email, code, EXPIRE_TIME, TimeUnit.SECONDS); | |
} | |
public String getVerificationCode(String email) { | |
return redisTemplate.opsForValue().get(CODE_PREFIX + email); | |
} | |
public boolean isCodeValid(String email, String code) { | |
String cachedCode = getVerificationCode(email); | |
return cachedCode != null && cachedCode.equals(code); | |
} | |
} |
- 使用服务
现在,你可以在你的控制器或其他服务中调用这些服务来发送邮件和验证验证码。
注意:为了安全起见,你应该在发送验证码时添加一些额外的逻辑,如限制发送频率、验证码的复杂性、IP检查等。此外,你还应该考虑使用HTTPS来保护你的API端点,以防止中间人攻击。
相关文章:
springBoot实现发送邮箱验证码 redis缓存源码
要在Spring Boot中实现发送邮箱验证码并使用Redis进行缓存,你需要遵循几个步骤。以下是一个简化的示例,展示了如何整合这些功能: 添加依赖 首先,确保你的pom.xml(Maven)或build.gradle(Gradle…...
QT--4
QT 使用定时器完成闹钟 #include "widget.h" #include "ui_widget.h"void Widget::timestart() {timer.start(1000); }void Widget::timeend() {timer.stop(); }Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(t…...
感染了后缀为.360勒索病毒如何应对?数据能够恢复吗?
导言: 在数字化时代的浪潮中,网络安全问题如同暗流涌动,威胁着每一个互联网用户的安宁。而近年来,一种名为.360勒索病毒的新型网络威胁逐渐浮出水面,以其独特的加密方式和狡猾的传播策略,给全球网络安全带…...
JavaSE多态
多态:一个对象在不同条件下表示的不同形态就叫多态。在程序中,多态是父类引用指定子类对象就叫多态。 多态是面向对象程序设计中的第三个特征 // 多态 class Father {String name;public void desc() {System.out.println("----------");Sys…...
M 有效算法
M 有效算法 本题考验二分知识,思路是二分k的取值,就按第一组样例来说当我们k取值为1的时候我们遍历数组想让|8-x|<k1的话x的取值范围是7-9,想让|3-x|<k2的话x的取值范围是1-5,两者x的区间不重合,说明肯定没有x能…...
知识付费系统制作,托管机构如何提高体验课转化率?要注意什么?
现在托管机构非常流行,一所学校周边就会出现好几家托管机构,所以竞争非常激烈。很多托管机构为了扩大生源,会选择体验课来让学生体验,至于如何提高体验课转化率,就看机构的本事了。 1、市场调研:摸清当前我…...
【iOS逆向与安全】网上gw如何自动登录与签到SM2,SM3,SM4算法加解密
1.下载 app 2.frida 调试 3.抓包查看接口 4.分析加密数据 5.易语言编写代码 1 .开始下载 下载好发现有越狱检测,检测点为: -[AppDelegate isJailBreak]; 于是编写插件xm代码 : %hook AppDelegate- (void)isJailBreak{NSLog("AppDelegate is…...
《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第14章 包管理helm v3
前言 考试大纲: 了解helm是如何工作的,从而实现快速部署应用 本章要点: 考点1:添加helm源 考点2:使用helm 部署应用 前面在使用wordpress + mysql 部署博客应用的时候,需要做许多工作,需要每个pod创建pv和pvc,然后分别创建每个应用pod及svc,整个过程非常麻烦. 如果搭建博客的…...
蓝桥杯备战.19有奖问答dfs
P9230 [蓝桥杯 2023 省 A] 填空问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n //#define int long long const int N 2e510; int a[N],w[N]; int ans 0; void dfs(int score,int cnt) {if(cnt>3…...
【JS红宝书学习笔记】第1、2章 初识JS
第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言,包含以下三个组成部分。 ECMAScript:由 ECMA-262 定义并提供核心功能。文档对象模型(DOM):提供与网页内容交互的方法和接口。浏览器对象模型&…...
学习java
在实验室看见这本书,无聊看了下,写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序: package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…...
Redis日常维护流程及技巧:确保稳定性与性能
目录 一、监控和报警设置 1.实时监控:洞察Redis的脉搏 (1). 资源使用监控 (2). 数据访问模式监控 (3). 持久化监控 (4). 客户端连接 2.报警机制:快速响…...
牛客华为机试题——难度:入门(python实现)
HJ7 取近似值 HJ9 提取不重复的整数 HJ46 截取字符串 HJ58 输入n个整数,输出其中最小的k个 HJ101 输入整型数组和排序标识,对其元素按照升序或降序进行排序 HJ7 取近似值 描述:写出一个程序,接受一个正浮点数值,输…...
数据结构与算法学习笔记之线性表五---循环链表的表示和实现(C++)
目录 前言 1.双向链表的定义 2.双向链表的表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.表长 6.获取数据元素 7.前驱节点 8.后继节点 9.插入 10.删除 11.遍历 12.完整代码 前言 记录下双向链表的表示和实现。 1.循环链表的定义 循环链表(circular linked list)…...
微信小程序生命周期揭秘:从启动到消亡的全过程剖析【附代码】
微信小程序生命周期揭秘:从启动到消亡的全过程剖析 一、小程序生命周期概览核心生命周期函数 二、深入理解生命周期回调2.1 onLoad: 首次亮相的准备2.2 onShow: 重登舞台的瞬间2.3 onReady: 舞台就绪,静待表演2.4 onHide & onUnload: 谨慎离场&#…...
Linux 下载 miniconda
https://repo.anaconda.com/miniconda/ 下载对应版本: wget -c https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh给下载的文件添加可执行权限 chmod x Miniconda3-py310_24.3.0-0-Linux-x86_64.sh安装 ./Miniconda3-py310_24.3.…...
第十五篇:全面防护:构建不容侵犯的数据库安全策略与实战指南
全面防护:构建不容侵犯的数据库安全策略与实战指南 1. 引言:数据库安全的现代战略 1.1 简介:数据库安全在当今的数字化时代中的重要性 在数字化的浪潮中,数据已成为企业乃至国家的核心资产,其价值不亚于实体世界的黄…...
电脑快速搜索文件及文件夹软件——Everything
一、前言 Everything是一款由voidtools开发的文件搜索工具,主要运行于Windows操作系统上。它的主要功能是快速、高效地搜索电脑上的文件和文件夹名称。Everything通过利用NTFS文件系统的MFT(主文件表)来索引文件,从而实现几乎实时…...
02-登录页面、动态路由、权限等模块开发
权限模块开发流程 前端login页面开发后端SpringSecurity配置后端login接口开发前端页面框架搭建前端路由守卫,状态管理开发前后端完成认证流程 开发Login页面 创建Login页面创建router,可以跳转到Login页面 Login页面 使用element-plus开发 认证功…...
万物生长大会 | 创邻科技再登杭州准独角兽榜单
近日,由民建中央、中国科协指导,民建浙江省委会、中国投资发展促进会联合办的第八届万物生长大会在杭州举办。 在这场创新创业领域一年一度的盛会上,杭州市创业投资协会联合微链共同发布《2024杭州独角兽&准独角兽企业榜单》。榜单显示&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
