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

谷粒商城实战笔记-214~219-商城业务-认证服务-验证码防刷校验

文章目录

  • 一,验证码防刷校验
    • 1,第三方服务提供发送短信的接口
    • 2,登录服务提供给前端的接口
  • 二,215-商城业务-认证服务-一步一坑的注册页环境
  • 三,商城业务-认证服务-异常机制
  • 四,217-商城业务-认证服务-MD5&盐值&BCrypt
  • 五,218-商城业务-认证服务-注册完成
  • 六,219-商城业务-认证服务-账号密码登录完成
  • 总结

包含:

  • 214-商城业务-认证服务-验证码防刷校验
  • 215-商城业务-认证服务-一步一坑的注册页环境
  • 216-商城业务-认证服务-异常机制
  • 217-商城业务-认证服务-MD5&盐值&BCrypt
  • 218-商城业务-认证服务-注册完成
  • 219-商城业务-认证服务-账号密码登录完成

一,验证码防刷校验

1,第三方服务提供发送短信的接口

短信服务可以给多方提供服务,所以要提供一个接口,接受电话号码和code,调用接口将code发送给指定的电话号码。

@Controller
@RequestMapping(value = "/sms")
public class SmsSendController {@Resourceprivate SmsComponent smsComponent;/*** 提供给别的服务进行调用* @param phone* @param code* @return*/@GetMapping(value = "/sendCode")public R sendCode(@RequestParam("phone") String phone, @RequestParam("code") String code) {//发送验证码smsComponent.sendCode(phone,code);return R.ok();}}

2,登录服务提供给前端的接口

@Controller
public class LoginController {@Resourceprivate ThirdPartFeignService thirdPartFeignService;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@ResponseBody@GetMapping(value = "/sms/sendCode")public R sendCode(@RequestParam("phone") String phone) {//1、接口防刷String redisCode = stringRedisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX + phone);if (StrUtil.isNotEmpty(redisCode)) {//活动存入redis的时间,用当前时间减去存入redis的时间,判断用户手机号是否在60s内发送验证码long currentTime = Long.parseLong(redisCode.split("_")[1]);if (System.currentTimeMillis() - currentTime < 60000) {//60s内不能再发return R.error(BizCodeEnum.SMS_CODE_EXCEPTION.getCode(),BizCodeEnum.SMS_CODE_EXCEPTION.getMessage());}}//2、验证码的再次效验 redis.存key-phone,value-codeint code = (int) ((Math.random() * 9 + 1) * 100000);String codeNum = String.valueOf(code);String redisStorage = codeNum + "_" + System.currentTimeMillis();//存入redis,防止同一个手机号在60秒内再次发送验证码stringRedisTemplate.opsForValue().set(AuthServerConstant.SMS_CODE_CACHE_PREFIX+phone,redisStorage,10, TimeUnit.MINUTES);thirdPartFeignService.sendCode(phone, codeNum);return R.ok();}}

这段代码用于共前端调用,发送短信验证码,其主要作用如下:

  1. 接口防刷机制:首先检查Redis中是否已经为提供的手机号码phone存储了验证码。如果存在,并且当前时间与存储验证码时的时间差小于60秒,则认为请求过于频繁,返回错误信息,阻止用户在短时间内重复发送验证码。

  2. 生成验证码:如果用户请求发送验证码的频率正常,代码将生成一个六位数的随机验证码。

  3. 存储验证码到Redis:将生成的验证码和当前时间戳拼接,存储到Redis中,其中键为手机号码,值为验证码和时间戳的组合。这用于验证验证码的有效性,并防止同一个手机号在60秒内再次发送验证码。

  4. 调用第三方服务发送验证码:通过Feign服务调用第三方服务(例如短信服务提供商)发送验证码到用户的手机上。

  5. 返回操作结果:如果验证码发送成功,方法返回一个表示操作成功的响应。

关于发送验证的两个要点:

  • 1,因为要验证用户输入的验证码是否正确,需要后台将生成的验证码进行保存,因为不需要持久化,所以保存在redis中。
  • 2,为了防止恶意调用,所以要在后台进行验证,60秒内只能调用一次,超过一次的返回错误,不允许重发。

二,215-商城业务-认证服务-一步一坑的注册页环境

这一节的主要内容是:

  • 校验前端登录参数是否符合标准
  • 如果不符合校验规则,将错误信息返回给前端,由前端回显

封装前端参数的VO,VO使用了JSR303校验,简化代码。

@Data
public class UserRegisterVo {@NotEmpty(message = "用户名不能为空")@Length(min = 6, max = 19, message="用户名长度在6-18字符")private String userName;@NotEmpty(message = "密码必须填写")@Length(min = 6,max = 18,message = "密码必须是6—18位字符")private String password;@NotEmpty(message = "手机号不能为空")@Pattern(regexp = "^[1]([3-9])[0-9]{9}$", message = "手机号格式不正确")private String phone;@NotEmpty(message = "验证码不能为空")private String code;}

这里有个小细节,前端登录界面登录请求会携带参数,校验不通过,需要把错误信息返回给前端,因为使用了了模板引擎,课程中采用请求转发的方式,实际上在直接返回错误信息应该也是可以的,只要前端做好适配。

三,商城业务-认证服务-异常机制

登录请求的参数校验通过后,需要验证验证码是否正确,从redis中取出存储的验证码,然后校验即可。

如果验证码校验通过,下一步要调用member会员服务的接口,注册会员。

会员服务提供的这个接口中,需要做一些校验:

  • 用户名要唯一
  • 手机号要唯一

如果校验不通过,通过抛异常的方式将信息抛给controller层。

四,217-商城业务-认证服务-MD5&盐值&BCrypt

对于用户的密码,不能存储明文,必须对其进行加密。

加密有两种方式:

  • 不可逆的加密,不能根据密文推出明文
  • 可逆的加密,可以根据密文推出密文
  • 为了防止相同的密码有相同的密文,通常采用加盐的方式,这样即使多个用户的密码相同,存储在数据库的密文也不是一样的

课程中采用不可逆的加密,在实际工作中一般也采用不可逆的加密。

MD5是常用的不可逆加密算法,我们使用Spring提供的工具类BCryptPasswordEncoder 对密码进行md5加密。

		BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();String encode = bCryptPasswordEncoder.encode(vo.getPassword());memberEntity.setPassword(encode);

MD5(Message Digest Algorithm 5,信息摘要算法5)是一种广泛使用的加密算法,用于生成数据的哈希值。

  1. 压缩性:无论输入数据的长度如何,MD5算法都会生成一个固定长度(128位,即16字节)的哈希值。

  2. 易于计算:从原始数据计算出MD5值是一个相对简单和快速的过程。

  3. 抗修改性:对原始数据进行任何微小的改动,哪怕是修改一个字符,都会导致生成的MD5值发生显著的变化。

  4. 强抗碰撞性:找到两个不同的数据输入,它们具有相同的MD5值,被认为是非常困难的。但是,这并不意味着MD5没有碰撞,实际上,MD5的抗碰撞性已经被证明是不足够的,尤其是在密码学领域。

  5. 加盐(Salting):为了增加MD5的安全性,可以通过添加一个随机生成的盐值(Salt)与原始数据组合,然后进行MD5加密。数据库中存储加密后的MD5值和盐值。在验证数据时,使用相同的盐值对输入数据进行MD5加密,然后与存储的MD5值进行比较以验证正确性。

五,218-商城业务-认证服务-注册完成

这一节主要调试注册服务的完成。

六,219-商城业务-认证服务-账号密码登录完成

这一节生完成登录的后台接口,主要的逻辑:

  • 权限认知服务接收前端页面的参数
  • 校验通过后调用会员服务的接口,接口根据参数查询数据库,判断用户名和密码是否正确

总结

  1. 错误处理:首先检查表单验证结果result是否有错误。如果有错误,将错误信息收集并存储到errors映射中,然后重定向回注册页面。

  2. 验证码验证:从前端获取用户输入的验证码code,然后从Redis中获取存储的验证码redisCode。如果Redis中有对应的验证码,并且用户输入的验证码与Redis中的验证码匹配,则进行下一步。

  3. 删除验证码:如果验证码匹配,从Redis中删除该验证码,防止重复使用。

  4. 远程服务注册:调用远程服务memberFeignService.register(vos)进行用户注册。

  5. 注册结果处理

    • 如果注册成功(register.getCode() == 0),重定向到登录页面。
    • 如果注册失败,收集错误信息,存储到errors映射中,然后重定向回注册页面。
  6. 验证码不匹配或不存在处理:如果用户输入的验证码与Redis中的不匹配,或者Redis中没有对应的验证码,收集错误信息,存储到errors映射中,然后重定向回注册页面。

整体上,这段代码实现了用户注册时的验证码验证、错误处理和注册结果反馈,确保了注册流程的安全性和用户体验。

相关文章:

谷粒商城实战笔记-214~219-商城业务-认证服务-验证码防刷校验

文章目录 一&#xff0c;验证码防刷校验1&#xff0c;第三方服务提供发送短信的接口2&#xff0c;登录服务提供给前端的接口 二&#xff0c;215-商城业务-认证服务-一步一坑的注册页环境三&#xff0c;商城业务-认证服务-异常机制四&#xff0c;217-商城业务-认证服务-MD5&…...

在华为服务器的openEuler系统中适配Pytorch调用NPU

服务器架构&#xff1a;aarch64 yolov7 和 mindyolo 二选一即可&#xff0c;yolov7是基于pytorch&#xff0c;mindyolo是基于mindspore 本文档基于CANN8.0RC3 , 刚发布比较新&#xff0c;如果有问题&#xff0c;可将CANN版本降低 导读 资料首页&#xff1a;https://www.hiasce…...

MVCC工作原理深入解析

一、事务概述 mysql事务是指一组命令操作&#xff0c;在执行过程中用来保证要么全部成功&#xff0c;要么全部失败。事务是由引擎层面来支持的&#xff0c;MyISM引擎不支持事务&#xff0c;InnoDB引擎支持事务。 事务具有ACID四大特性 原子性&#xff08;Atomicity&#xff0…...

使用html+css+js实现完整的登录注册页面

在这篇博客中&#xff0c;我们将讨论如何使用简单的 HTML 和 CSS 构建一个登录与注册页面。这个页面包含两个主要部分&#xff1a;登录界面和注册界面。我们还会展示如何通过 JavaScript 切换这两个部分的显示状态。 页面结构 我们将创建一个页面&#xff0c;其中包含两个主要…...

2024年8月16日(运维自动化 ansible)

一、回顾 1、mysql和python (1)mysql5.7 1.1不需要执行mysql_ssl_rsa_setup 1.2change_master_to 不需要get public key (2)可以使用pymysql非交互的管理mysql 2.1pymysql.connect(host,user,password,database,port) 2.2 cursorconn.cursor() 2.3 cursor.execute("creat…...

荣耀Magicbook x14 扩容1TB固态

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 固态硬盘规格 在官网查看加装固态硬盘的接口规格 https://www.honor.com/cn/laptops/honor-magicbook-x14-2023/ https://club.honor.com/cn/thread-2847379…...

Springboot整合全文检索引擎Lucene

文章目录 前言Lucene的介绍springboot项目中如何整合Lucene简单用法1. 引入依赖2. 其它用到的类2. 创建索引3. 简单搜索4. 更新索引5. 删除索引6. 删除全部索引 Springboot整合Lucene复杂搜索1. 同时标题和内容中查找关键词2. 搜索结果高亮显示关键词3. 分页搜索4. 多关键词联合…...

【深度学习】【语音】TTS, 如何使用Python分析WAV的采样率、比特深度、通道数

文章目录 使用Python分析WAV文件的属性与可视化简介所需环境代码解析可视化音频数据结论使用Python分析WAV文件的属性与可视化 WAV文件录音要求 为了确保录制的音频文件符合TTS模型训练的质量标准,请遵循以下录音要求: 采样率要求:44.1 kHz说明:采样率44.1 kHz(即每秒采样…...

Linux的安装和使用

Linux 第一节 Linux 优势 1. 开源 为什么这么多的的设备都选择使用 Linux&#xff1f;因为它是开源软件&#xff08;open source software&#xff09;&#xff0c;具有不同的含义。使用一个安全的操作系统工作变得必不可少的事&#xff0c;而 Linux 恰好满足了这个需求。因…...

查看一个exe\dll文件的依赖项

方法 使用一个Dependencies工具&#xff0c;检测exe文件的所有依赖项 工具使用 下载压缩包之后解压&#xff0c;解压后如下图所示 在命令行中运行Dependencies.exe程序会得到帮助菜单 查询某exe的所有依赖项&#xff0c;使用命令 Dependencies.exe -chain <查询文件> …...

高校科研信息管理系统pf

TOC springboot364高校科研信息管理系统pf 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这个新的时代&#xff0c;…...

Linux 开机自动挂载共享文件设置

选择一个要共享的文件 点击确定 -> 确定 启动虚拟机 执行下面的命令 /YumSource 是我选择的共享文件夹&#xff0c;自行替换自已选择的文件夹 mkdir -p /mnt/hgfs cat >> /etc/fstab << EOF .host:/YumSource /mnt/hgfs fuse.vmhgfs-fuse allow_other defaul…...

c_cpp_properties.json、launch.json、 tasks.json

在 Visual Studio Code 中&#xff0c;c_cpp_properties.json、launch.json 和 tasks.json 是三个重要的配置文件&#xff0c;它们的作用如下&#xff1a; c_cpp_properties.json&#xff1a; 这个文件用于配置 C/C 扩展的 IntelliSense、编译器路径和包括路径等。它帮助 VS Co…...

mysql 一些知识点 面试用

mysql 1、4个隔离级别与3个现象2、快照读与当前读2.1 可重复读的情况下出现幻读问题的两种情况 3 数据库 常用引擎4、InnoDB存储引擎对MVCC的实现5、索引(重点)5.1 什么是索引5.2 索引的创建与删除5.2.1 查看表中有哪些索引5.2.2 添加索引5.2.3 删除索引 5.3 索引的分类5.4 树数…...

STM32之点亮LED灯

使用固件库实现LED点灯 LED灯&#xff1a; LED灯&#xff0c;是一种能够将电能转化为可见光的半导体器件 控制LED灯&#xff1a; LED灯的正极接到了3.3V&#xff0c;LED灯的负极接到了PA1&#xff0c;也就是GPIOA1引脚 只需要控制PA1为相对应的低电平&#xff0c;即可点亮对…...

Java 多线程练习2 (抽奖比较Runnable写法)

MultiProcessingExercise2 package MultiProcessingExercise120240814;import java.util.ArrayList; import java.util.Collections;public class MultiProcessingExercise1 {public static void main(String[] args) {// 需求&#xff1a;// 在此次抽奖过程中&#xff0c;抽奖…...

使用fastboot更新部分系统

使用fastboot更新部分系统 获取分区信息 > part list sunxi_flash 0Partition Map for UNKNOWN device 0 -- Partition Type: EFIPart Start LBA End LBA NameAttributesType GUIDPartition GUID1 0x00008000 0x000097c5 "boot-r…...

windows 加载portch遇到的错误

import torch 遇到如下错误 File "<stdin>", line 1, in <module> File "C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\torch\__init__.py", line 148, in <module> raise err OSError: [W…...

如何将 CICD 模版重构为 CICD component?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

数学建模——评价决策类算法(层次分析法、Topsis)

一、层次分析法 概念原理 通过相互比较确定各准则对于目标的权重, 及各方案对于每一准则的权重&#xff0c;这些权重在人的思维过程中通常是定性的, 而在层次分析法中则要给出得到权重的定量方法. 将方案层对准则层的权重及准则层对目标层的权重进行综合, 最终确定方案层对目标…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...