SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.3 手机验证码案例 - 生成验证码

news2025/1/12 1:00:47

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 开发实用篇

文章目录

      • SpringBoot
      • SpringBoot 开发实用篇
      • 5 整合第三方技术
        • 5.3 手机验证码案例 - 生成验证码
          • 5.3.1 SpringBoot 的缓存方案
          • 5.3.2 缓存使用案例 —— 手机验证码

5 整合第三方技术

5.3 手机验证码案例 - 生成验证码

5.3.1 SpringBoot 的缓存方案

SpringBoot提供的缓存技术除了提供默认的缓存方案,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发与管理

刚刚我们做的就是用SpringBoot 默认的缓存技术实现的

在这里插入图片描述

在李老师录制课程那会儿,SpringBoot 可以整合的缓存技术

  • Generic
  • JCache
  • Ehcache
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple(默认)
  • memcached【市面常用】
5.3.2 缓存使用案例 —— 手机验证码

需求:

  • 输入手机号获取验证码,组织文档以短信形式发送给用户(页面模拟)
  • 输入手机号和验证码验证结果

需求分析:

  • 提供controller,传入手机号,业务层通过手机号计算出独有的6位验证码数据,存入缓存后返回此数据
  • 提供controller,传入手机号与验证码,业务层通过手机号从缓存中读取验证码与输入验证码进行比对,返回比对结果

【直接开干】

创建一个新的实体类【验证码】

package com.dingjiaxiong.domain;

import lombok.Data;

/**
 * ClassName: SMSCode
 * date: 2022/10/21 13:46
 *
 * @author DingJiaxiong
 */

@Data
public class SMSCode {

    private String tele;
    private String code;

}

直接做业务层【因为我们不用去数据库拿数据】

package com.dingjiaxiong.service;

import com.dingjiaxiong.domain.SMSCode;

/**
 * ClassName: SMSCodeService
 * date: 2022/10/21 13:47
 *
 * @author DingJiaxiong
 */


public interface SMSCodeService {

    //模拟发送验证码到手机
    public String sendCodeToSMS(String tele);

    //校验验证码
    public boolean checkCode(SMSCode smsCode);

}

先来一个生成6位加密验证码的“小工具类”

package com.dingjiaxiong.utils;

import org.springframework.stereotype.Component;

/**
 * ClassName: CodeUtils
 * date: 2022/10/21 13:53
 *
 * @author DingJiaxiong
 */

@Component
public class CodeUtils {

    private String[] patch = {"000000","00000","0000","000","00","0",""};

    public String generator(String tele){

        int hash = tele.hashCode();
        int encryption = 20206666;

        long result = hash ^ encryption; //异或
        long nowTime = System.currentTimeMillis();

        result = result ^ nowTime; //与系统当前时间再次异或

        long code = result % 1000000; //取加密后的后六位
        code = code < 0 ? -code : code ; //负数特殊处理
        String codeStr = code + "";//可能还得补0
        int len = codeStr.length();


        return patch[len] + codeStr;

    }

//    public static void main(String[] args) {
//        System.out.println(new CodeUtils().generator("18866668888"));
//    }

}

业务层实现类

package com.dingjiaxiong.service.impl;

import com.dingjiaxiong.domain.SMSCode;
import com.dingjiaxiong.service.SMSCodeService;
import com.dingjiaxiong.utils.CodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * ClassName: SMSCodeServiceImpl
 * date: 2022/10/21 13:50
 *
 * @author DingJiaxiong
 */

@Service
public class SMSCodeServiceImpl implements SMSCodeService {

    @Autowired
    private CodeUtils codeUtils;

    @Override
    @Cacheable(value = "smsCode" ,key = "#tele")
    public String sendCodeToSMS(String tele) {
        String code = codeUtils.generator(tele);
        return code;
    }

    @Override
    public boolean checkCode(SMSCode smsCode) {
        return false;
    }
}

校验还没写

控制器

package com.dingjiaxiong.controller;

import com.dingjiaxiong.domain.SMSCode;
import com.dingjiaxiong.service.SMSCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * ClassName: SMSCodeController
 * date: 2022/10/21 13:51
 *
 * @author DingJiaxiong
 */

@RestController
@RequestMapping("/sms")
public class SMSCodeController {

    @Autowired
    private SMSCodeService smsCodeService;

    @GetMapping
    public String getCode(String tele){
        String code = smsCodeService.sendCodeToSMS(tele);
        return code;
    }

    @PostMapping
    public boolean checkCode(SMSCode code){
        return smsCodeService.checkCode(code);
    }

}

直接启动服务器

在这里插入图片描述

直接测试一下生成验证码

在这里插入图片描述

这样就得到了一个验证码,再发一次

在这里插入图片描述

并没有变化好家伙,验证码过期机制没了

什么原因

这是因为业务层中

在这里插入图片描述

第一次访问,生成一个code 存入缓存后,下一次再访问时,检测到手机号没变,直接返回了第一次生成的验证码。这显然是不符合常理的【这样就可以看到@Cacheable 这个注解在现在这个场景下就不适用了】

我们需要仅仅在把单次操作放到缓存,但是不要主动去读

换一个

@CachePut(value = "smsCode" ,key = "#tele")

这个就没有取的操作了

在这里插入图片描述

重启服务器,再试一次

在这里插入图片描述

这样就每次都不一样了

【OK,这样第一步就完成了,生成验证码,并且“放入”缓存】

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

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

相关文章

众焱公司网络平台建设-传输网的规划与设计

目 录 摘 要 I Abstract II 第一章 项目概述 1 1.1 项目目标 1 1.1.1 总体目标 1 1.1.2 阶段目标 1 1.2 设计原则 2 1.3总体拓扑图设计 3 第二章 应用分析 4 2.1 应用分类 4 2.1.1 应用系统总体框架 4 2.1.2 业务系统应用分类 5 2.1.3 信息管理系统应用分类 6 2.2 数据中心及分…

数据结构:栈和队列

栈是一种特殊的线性结构&#xff0c;只允许在栈顶进行进行插入和删除操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出&#xff08;先进后出&#xff09;LIFO&#xff08;Last In First Out&#xff09;的原则。 类比成将子…

小学生python游戏编程arcade----爆炸粒子类

小学生python游戏编程arcade----爆炸粒子类前言1.1 参数设置粒子加速下降的速度。如果不需要&#xff0c;则为0粒子退出的速度粒子移动的速度。范围为2.5<-->5&#xff0c;设置为2.5和2.5。每次爆炸有多少粒子粒子直径多大粒子颜色列表我们有可能将纹理翻转为白色&#x…

芒果改进YOLOv7系列:首发改进特征融合网络BiFPN结构,融合更多有效特征

💡统一使用 YOLOv7 代码框架,结合不同模块来构建不同的YOLO目标检测模型。文章目录 一、BiFPN论文理论部分代码部分YOLOv7+BiFPN在这篇文章中,将BiFPN结构加入到 YOLOv7 结构中 一、BiFPN论文理论部分 EfficientDet: Scalable and Efficient Object Detection BiFPN与P…

芯天下在创业板过会:预计全年收入将达到10亿元,净利润约2亿元

11月18日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;芯天下技术股份有限公司&#xff08;下称“芯天下”&#xff09;获得上市委会议通过&#xff0c;即IPO过会。据贝多财经了解&#xff0c;芯天下于2022年4月28日在创业板递交上市申请材料。 本次冲刺创业板上…

vins-mono初始化代码分析

大体流程 初始化主要分成2部分&#xff0c;第一部分是纯视觉SfM优化滑窗内的位姿&#xff0c;然后在融合IMU信息。 这部分代码在estimator::processImage()最后面。 主函数入口&#xff1a; void Estimator::processImage(const map<int, vector<pair<int, Eigen:…

maven大全(概述、maven安装配置、IDEA配置maven、IDEA创建maven项目并如何使用)

目录 一、概述 1.什么是maven&#xff1f; 2.maven有什么作用&#xff1f; &#xff08;1&#xff09;提供了一套标准化的项目结构 &#xff08;2&#xff09;提供了标准化的构建流程&#xff08;编译、测试、打包、发布&#xff09; &#xff08;3&#xff09;提供了一套…

Java -- 每日一问:后台服务出现明显“变慢”,谈谈你的诊断思路?

典型回答 首先&#xff0c;需要对这个问题进行更加清晰的定义: 服务是突然变慢还是长时间运行后观察到变慢&#xff1f;类似问题是否重复出现&#xff1f;“慢”的定义是什么&#xff0c;我能够理解是系统对其他方面的请求的反应延时变长吗? 第二&#xff0c;理清问题的症状…

【计算机考研必备常识】24考研你开始准备了吗?

前言 23考研只剩下一个多月了&#xff0c;准备 【24考研】 的小伙伴是否有一丝丝焦虑了呢&#xff1f; 对于考研相关的常识问题&#xff0c;你又是否有了解呢&#xff1f;考研全流程&#xff1f;计算机考研考什么&#xff1f;学硕和专硕怎么选 … 一系列考研相关的常识问题博…

JWT和token是什么?如何利用token进行身份验证?

什么是token&#xff1f;什么是JWT&#xff1f;如何基于token进行身份验证&#xff1f; 我们都知道session信息需要保存一份在服务器端。这种方式会带来一些麻烦&#xff0c;比如需要我们保证保存session信息服务器的可用性、不适合移动端等。 有没有一种不需要自己存放sessi…

五、DMSQL

五、数据类型与操作符和常用DMSQL语句 1、数据类型与操作符介绍 达梦数据库支持的数据类型有很多&#xff0c;具体如下&#xff1a; 其中&#xff1a; 常规数据类型 数值数据类型字符数据类型多媒体数据类型日期时间数据类型 一般日期时间类型时区数据类型时间间隔数据类型 B…

辰奕智能在创业板过会:计划募资约4亿元,约有五成来自境外

11月18日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;广东辰奕智能科技股份有限公司&#xff08;下称“辰奕智能”&#xff09;获得上市委会议通过&#xff0c;即IPO过会。据贝多财经了解&#xff0c;辰奕智能于2021年12月31日在创业板递交上市申请材料。 本次…

【论文阅读】社交网络传播最大化问题-01

问题定义&#xff1a;构建传播最大化模型&#xff08;最大化末态时的激活节点数量 &#xff09;& 确定最具影响力节点 思考问题&#xff1a; 影响节点影响力的因素&#xff1f;有向图和无向图的模型构建区别&#xff1f; 定义参数&#xff1a; 节点影响力的取值范围节点…

Thinkphp6.0.x反序列化漏洞复现

漏洞起点 起因: 在做 [安洵杯 2019]iamthinking 时发现是 thinkphp6 的反序列化&#xff0c;那么就去复现一下呗。 看了其他大佬的 wp&#xff0c;上面说 tp6 的反序列化漏洞的后半段利用和 tp5.2.x 是一样的&#xff0c;也就是 __toString 函数上。 第一步相信大家都知道&a…

USV合伙人反思FTX:应以更长远的眼光看待Web3

潜力博主推荐&#xff0c;点击上面关注博主 ↑↑ FTX的事件动摇了许多人的信心。那么&#xff0c;最大的加密货币交易所之一是如何迅速崩溃的&#xff1f;为什么加密世界的类似崩溃似乎一直在发生&#xff1f; 在这个时候&#xff0c;我们要对Web3整个行业&#xff0c;有一个更…

FA-PEG-N3,Folic acid-PEG-Azide,叶酸-聚乙二醇-叠氮一种叶酸PEG试剂

叶酸PEG试剂叶酸-聚乙二醇-叠氮&#xff0c;其英文名为Folic acid-PEG-Azide&#xff08;FA-PEG-N3&#xff09;&#xff0c;它所属分类为Azide PEG Folic acid&#xff08;FA&#xff09; PEG。 叶酸-PEG-叠氮的的分子量均可定制&#xff0c;有&#xff1a;FA-PEG-N3 5000、叶…

感受Vue (1) —— Hello world

虽然一直定位自己是个后端&#xff0c;但是我一直钟情于好看精致的界面&#xff0c;我觉得前端界面是门艺术并结合编程的美。爱美之心&#xff0c;人皆有之&#xff0c;不要怪我&#xff0c;也不能怪我。 vue 在前端框架中&#xff0c;世界范围内能排第三&#xff0c;也是很不简…

UE5笔记【零】快捷键

F&#xff1a;快速聚焦到所选中的对象。 Q&#xff1a;选择 W&#xff1a;移动、 E&#xff1a;旋转、 R&#xff1a;伸缩。 End&#xff1a;物体落在它下方的物体上。 组合键&#xff1a; 鼠标左键或者右键&#xff1a;E是跳跃&#xff0c;Q是蹲下。 Ctrl L:控制太阳高…

[附源码]SSM计算机毕业设计在线学习网站的设计与实现JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用docker 注册runner

获取gitlab 信息 需要从gitlab中获取两个信息&#xff0c;一个是gitlab的域名&#xff0c;一个是需要注册runner的token gitalb 的runner按照范围可以有三种 全局类型即整个gitlab 的项目都可使用的runnergroup类型&#xff1a;即当前group中的项目可使用的runner,不同group之…