redis整合通过QQ邮箱发送验证码

news2024/12/23 4:22:24

目录

1.QQ开启服务

 2.java中配置

2.1.导入依赖

 2.2.yml配置

2.2.1 mail配置

2.2.2 redis配置(与mail同级,在spring下一级)

2.3.conroller层

2.3.1 在controller类上加上

2.3.2 生成验证码方法

2.3.3发送邮件接口

2.3.4 用户登录接口(整合)

3.apifaox测试功能

3.1 idea直接导出接口到apifox

3.1.1 下载插件

3.1.2 来到apifox生成令牌

3.1.3 来到idea设置里面进行相关配置

 3.2 在apifox中手动添加接口


1.QQ开启服务

QQ邮箱地址:登录QQ邮箱

进入qq邮箱,点击右上角设置

 点击:

朝下翻,点击:

点击:

点击生成授权码复制一下即可: 

 2.java中配置

2.1.导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.7.4</version>
        </dependency>

 2.2.yml配置

2.2.1 mail配置

spring:
  mail:
    username: xxx@qq.com #申请服务的邮箱,也就是发送邮件的邮箱
    password: xxx #刚才申请服务产生的授权码
    host: smtp.qq.com  #默认
    default-encoding: UTF-8  #默认
    properties: #默认
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

2.2.2 redis配置(与mail同级,在spring下一级)

  redis:
    #Redis服务器地址  此处的host为通过ifconfig命令获取的linux的IP地址
    host: xxxx
    #密码
    password: xxx
    #Redis服务器连接端口
    port: 6379
    #Redis数据库索引(默认为0)
    database: 0
    #Redis连接超时时间(毫秒)
    timeout: 1800000
    #配置Redis连接池
    lettuce:
      pool:
        #Redis连接池的最大连接数(负数表示无限制)
        max-active: 20
        #Redis最大阻塞等待时间(负数表示没有限制)
        max-wait: -1
        #Redis连接池中的最大空闲连接数
        max-idle: 5
        #Redis连接池中的最小空闲连接数
        min-idle: 0

2.3.conroller层

2.3.1 在controller类上加上

    @Value("${spring.mail.username}")
    private String mailUsername;

2.3.2 生成验证码方法

//随机生成6位数字
    public String getCode(String mail) {
        Random random = new Random();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            stringBuilder.append(random.nextInt(10));
        }
        //将随机得到的验证码存入redis中设置过期时间为60s
//        redisTemplate.opsForValue().set("RedisCode", stringBuilder.toString(), 60, TimeUnit.SECONDS);
        String code = stringBuilder.toString();

        log.info("==============验证码=" + code);

        redisTemplate.opsForValue().set(mail, code, 60, TimeUnit.SECONDS);
        return stringBuilder.toString();
    }

2.3.3发送邮件接口

    //发送邮件
    @GetMapping("/email")
    public R sendEmail(String toMail) {
        SimpleMailMessage massage = new SimpleMailMessage();
        massage.setFrom(mailUsername);
        massage.setTo(toMail);
        massage.setSubject("黑客帝国为你服务,请收好你的验证码:");
        massage.setText(getCode(toMail));//发送内容为验证码
        mailSender.send(massage);
        return R.success("发送成功!");
    }

2.3.4 用户登录接口(整合)

/**
     * 用户登录
     */
    @PostMapping("/login")
    public R login(@RequestParam Map<String, Object> map) {
        String mail = (String) map.get("mail");
        String code = (String) map.get("code");
        String username = (String) map.get("username");
        String password = (String) map.get("password");

        //   log.info(code.toString());

        //从Session中获取保存的验证码
        // Object codeInSession = session.getAttribute(phone);

        //从redis获取缓存的验证码
        Object codeInSession = redisTemplate.opsForValue().get(mail);

        //进行验证码的比对(页面提交的验证码和Session中保存的验证码比对)
        if (codeInSession != null && codeInSession.equals(code)) {
            //如果能够比对成功,说明登录成功

            //如果用户登录成功,删除redis中缓存的验证码
            redisTemplate.delete(mail);

            log.info("==================验证码校验成功!====================");
            boolean flag = userService.queryPasswordByUsername(username, password);
            if (flag) {
                return R.success("登录成功!");
            } else {
                return R.error("密码错误!");
            }
        }
        return R.error("验证码错误!");
    }

3.apifaox测试功能

3.1 idea直接导出接口到apifox

3.1.1 下载插件

3.1.2 来到apifox生成令牌

点击:

复制生成的令牌

3.1.3 来到idea设置里面进行相关配置

然后右键点击你要导入的项目

 之后idea会弹出一个窗口,让你填写项目的id。

在apifox中复制一下你的项目ID填入即可。

 这时候去apifox点击右上角的刷新即可:

 3.2 在apifox中手动添加接口

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

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

相关文章

【事件驱动微服务架构】专家组:事件驱动的大规模架构

赖斯&#xff1a;欢迎来到我们关于架构的专题小组&#xff0c;你们一直想知道轨道。该专题小组称为事件驱动的大规模架构。当您思考事件驱动架构时&#xff0c;您会想到什么&#xff1f;这是规模、性能和灵活性的好处吗&#xff1f;也许你想到了一个你可能经历过的特殊问题。也…

Web Audio API实现简单变声效果

前言 想在网页中实现实时音频变声效果该如何实现呢&#xff0c;之前遇到这种处理音视频的需求&#xff0c;可能会想到需要借助C代码实现。但是现在随着浏览器性能的提升、web API的丰富&#xff0c;通过浏览器原生的API也可以操作音频数据实现很多复杂的效果&#xff0c;为web音…

mitt用100行实现发布-订阅模式还收获了9k的Star

我们先了解什么是发布-订阅模式&#xff0c;发布-订阅模式它是一种对象间一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都将得到状态的通知。 发布-订阅模式流程如下&#xff1a; 订阅者将自己想订阅的事件注册到调度中心&#xff1b;…

快手 Flink 的稳定性和功能性扩展

摘要&#xff1a;本文整理自快手技术专家刘建刚&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 快手 Flink 平台 2. 稳定性保障和智能运维 3. 复杂场景下的功能扩展 4. 批处理的定制优化 Tips&#xff1a;点击「阅读原文…

maven添加指定仓库和镜像

maven历史版本下载地址&#xff1a;https://archive.apache.org/dist/maven/maven-3/ maven版本和java版本的关系&#xff1a;https://maven.apache.org/docs/history.html 项目中添加仓库 有两种方式 1.在pom.xml中添加&#xff08;优先级高&#xff09; 2.在setting.xml中添…

【已解决】-Mac/Mac mini/Macbook上修改鼠标指针大小

问题&#xff1a; MacOS默认的鼠标指针太小了&#xff0c;平时很容易找不到在哪里。 解决办法&#xff1a; 在 Mac 上&#xff0c;点击苹果菜单 >“系统偏好设置”&#xff0c;然后点按“辅助功能” 。 点击“显示”&#xff0c;然后点击“指针”。 设定以下任一选项…

【SQL】Oracle实现远程访问

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

CDN和Web加速器之间的区别

在数字时代&#xff0c;网站、社交媒体、电子商务、内容流平台和超个性化网络体验激增。因此&#xff0c;需要实时可靠地为最终用户提供大量生成的内容&#xff0c;而不会出现延迟或崩溃&#xff0c;无论其位置、网络、设备或浏览器如何。为此&#xff0c;使用CDN和web加速器就…

【模电实验】运算放大器构成的温度闭环控制系统的研究

运算放大器构成的温度闭环控制系统的研究 —、实验目的 设计并连接运算放大器构成的温度闭环控制系统&#xff0c;测量并调试该闭环控制系统&#xff0c;初步形成闭环控制的概念。 二、温度闭环控制系统的工作原理 图1所示为温度闭环控制系统框图&#xff0c;各部分工作原理…

vue3中setup语法糖那些事儿

vue3中setup语法糖那些事儿 什么是语法糖&#xff1f;vue3相比于vue2有什么新的语法糖?refreactivewatch生命周期Teleport setup语法糖<script setup>与传统vue3有何不同传统vue3和setup语法糖&#xff0c;两者之间写法如何转换&#xff1f; 什么是语法糖&#xff1f; …

NodeJs性能分析工具

&#xff08;头等人&#xff0c;有本事&#xff0c;没脾气&#xff1b;二等人&#xff0c;有本事&#xff0c;有脾气&#xff1b;末等人&#xff0c;没本事&#xff0c;大脾气。——南怀瑾&#xff09; NodeJs内存分析的必要性 回顾过去&#xff0c;我们排查web应用问题的途径…

EasyRecovery16计算机电脑硬盘格式化数据恢复软件

EasyRecovery16是一款综合性的数据恢复工具&#xff0c;软件具备非常成熟的算法&#xff0c;适用于多种数据丢失情况&#xff0c;可以帮助用户快速恢复不同介质丢失的数据。easyrcovery软件共有三种版本&#xff0c;分别为个人版、专业版、企业版。这三种版本的软件都可以免费使…

市场类型与完全竞争市场

短期完全竞争市场 区分市场类型的几条标准&#xff1a; 生产者的数量商品的同质性&#xff08;差异化程度&#xff09;进出市场的障碍信息是否完全 市场类型&#xff1a; 完全垄断寡头垄断垄断性竞争完全竞争 完全竞争市场的特征&#xff1a; 企业&#xff1a;数目多&…

Python学习41:文本分析(1)——统计文件中的字符

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ open(name[, mode[, bufferi…

MySQL了解之复制(一)

1.1、复制解决的问题 数据复制技术有以下一些特点&#xff1a; (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 1.2、复制如何工作 从高层来看&#xff0c;复制分成三步&#xff1a; (1) master将改变记录到二进制…

第二十六章 开发Productions - ObjectScript Productions - 定义业务流程

文章目录 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程介绍业务逻辑工具的比较 第二十六章 开发Productions - ObjectScript Productions - 定义业务流程 业务流程负责生产中的更高级别处理。本页介绍它们并讨论如何设计和开发业务流程类。 介绍 …

三分钟快速了解什么是MES系统

近年来在制造业的推动下&#xff0c;大家是否会经常听到MES系统这一词&#xff0c;但是对于其具体能解决什么问题却不是很清晰。接下来&#xff0c;请允许我用一个简单的故事来让大家快速地了解一下到底什么是MES系统以及MES系统能够解决什么问题。本文仅限于科普&#xff0c;没…

STM32F103xx 的USART1 移植到STM32F105RBT6

1. STM32F103 和 STM32F105 的时钟配置区别&#xff0c;STM32F105 默认使用的外部晶振是25Mhz&#xff0c;需要改成8Mhz stm32f10x.h #if !defined HSE_VALUE#ifdef STM32F10X_CL#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz …

初学Mybatis

1、Mybatis概述 Mybatis基于java的持久层框架&#xff0c;内部封装了JDBC&#xff0c;开发者只需要关注SQL语句 特点 1、sql语句在xml里&#xff0c;便于统一管理和优化 2、解除sql与程序代码耦合&#xff1a;通过DAO层&#xff0c;将业务逻辑和数据访问逻辑分离 提供映射标签&…

Spark简介和三种部署方式

1.Spark简介 1.1 Spark介绍 开源集群计算系统&#xff0c;致力于更快的处理数据 Both fast to run and fast to wrtie Spark 是专为大规模数据处理而设计的快速通用的计算引擎 Spark 可以完成各种运算&#xff0c;包括 SQL 查询、文本处理、机器学习等 Spark由Scala语言开发&a…