短信登录功能如何实现?

简介:

在日常生活中我们登录/注册某些网站/APP是通常可以选择 密码登录和手机号登录

为什么手机号发送后会有验证码返回呢?

网站如何识别我的验证码是否正确?

如果我的个人网站也想要实现短信登录功能,具体该如何实现?

下面我将从用户的视角带着大家一步一步的了解短信登录背后的一切细节。

在这里插入图片描述

在这里插入图片描述

具体操作

输入手机号
在这里插入图片描述

点击【获取验证码
在这里插入图片描述
后台:

验证手机号

//Slfg4    日志注解public Result sendCode(String phone, HttpSession session) {//1:先验证手机号格式  不符合就返回错误信息if(RegexUtils.isPhoneInvalid(phone)){//2:如果不符合,返回错误信息return Result.fail("手机号格式错误");}//4:生成验证码String code = RandomUtil.randomNumbers(6);//保存验证码到redis phone作为key 并且有一个公共前缀stringRedisTemplate.opsForValue().set(RedisConstants.LOGIN_CODE_KEY +phone,code,RedisConstants.CACHE_NULL_TTL,TimeUnit.MINUTES);//6:发送验证码  此处是返回到前端log.debug("验证码是{}",code);return Result.ok();}
  • 符合格式 生成验证码 将其存在redis中并发送给前端

输入验证码

点击【注册并登录

  • 后台以手机号为key与redis中存储的验证码进行比对 不相同则返回 “验证码不正确”
  • 相同则看是否被注册过 并生成token
  • 如果没有注册则新建用户数据并插入新数据
  • 将用户的信息和token存入redis的map中
@Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//获取手机号String phone = loginForm.getPhone();if(RegexUtils.isPhoneInvalid(phone)){//2:如果不符合,返回错误信息return Result.fail("手机号格式错误");}//从reids中拿出验证码String code = stringRedisTemplate.opsForValue().get(RedisConstants.LOGIN_CODE_KEY + phone);if(loginForm.getPhone().equals(code)){//如果验证码错误直接返回falsereturn Result.fail("验证码不正确");}//如果正确 在确定手机号是否已经被注册过User user = query().eq("phone", phone).one();//生成token  用hutool工具类生成的uuid toString(true)可以把uuid中的-去掉String token = UUID.randomUUID().toString(true);if(user==null){//没有注册过新建并插入新数据user=CreateNewUser(phone);}//hutool工具类 BeanutilUserDTO userDTO= BeanUtil.copyProperties(user, UserDTO.class);//运用redis中的map数据结构存储userDto对象Map<String,String> map=new  HashMap<>();map.put("id",userDTO.getId().toString());map.put("nickName",userDTO.getNickName());map.put("icon",userDTO.getIcon());stringRedisTemplate.opsForHash().putAll(RedisConstants.LOGIN_USER_KEY+token,map);//设置时间一般是30分钟不进行操作,就会失效stringRedisTemplate.expire(RedisConstants.LOGIN_USER_KEY+token, RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);return Result.ok(token);}private User CreateNewUser(String phone) {User user=new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX+RandomUtil.randomString(4));save(user);return  user;}

验证成功 开始登录 拦截器的实现

  • 拦截器 一:更新token信息/放行空token 用token从redis里拿出map对象转化为UserDTO对象存入ThreadLocal中,通过所有拦截器后释放
  • 拦截器二:判断ThreadLocal中有没有UserDTO对线,有则放行,没有拦截

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Webpack监视文件修改,自动重新打包文件

方法一&#xff1a;使用watch监视文件变化 在终端中输入以下指令&#xff1a; npx webpack --watch 我们使用这种方法监听文件变化时只会监听我们计算机本地的文件变化&#xff0c;在开发场景中我们的项目是要部署到服务器中的&#xff0c;因此这种方式并不推荐。 方法二&…

8款常见的自动化测试开源框架

在如今开源的时代&#xff0c;我们就不要再闭门造车了&#xff0c;热烈的拥抱开源吧&#xff01;本文针对性能测试、Web UI 测试、API 测试、数据库测试、接口测试、单元测试等方面&#xff0c;为大家整理了github或码云上优秀的自动化测试开源项目&#xff0c;希望能给大家带来…

Python_it_heima

P63 list P68 元组 注意&#xff1a;元组内部嵌套的list包含的内容可以修改&#xff0c;但list本身不能修改。 P69 字符串 P71 数据容器&#xff08;序列&#xff09;的切片 P73 集合 P75 字典 字典的常用操作 字典课后练习 P78 类数据容器的总结对比 P79 数据容器的通用操作 不…

useCallBack

React.memo 保证了只有props发生变化时&#xff0c;该组件才会重新渲染 &#xff08;当然组件内部的state 和 context 变化也会导致组件重新渲染&#xff09;&#xff0c;但咱们只要将咱们的子组件包裹&#xff0c;便可以保证Child组件在props不变的情况下&#xff0c;不会重新…

万字解析30张图带你领略glibc内存管理精髓

最近在逛知乎的时候&#xff0c;看到篇帖子&#xff0c;如下&#xff1a; 看了下面所有的回答&#xff0c;要么是没有回答到点上&#xff0c;要么是回答不够深入&#xff0c;所以&#xff0c;借助本文&#xff0c;深入讲解C/C内存管理。 1 写在前面 源码分析本身就很枯燥乏味…

007 数据结构_堆——“C”

前言 本文将会向您介绍关于堆Heap的实现 具体步骤 tips&#xff1a;本文具体步骤的顺序并不是源代码的顺序 typedef int HPDataType; typedef struct Heap {HPDataType* _a;int _size;int _capacity; }Heap;初始化 void HeapCreate(Heap* hp, HPDataType* a, int n) {hp-&…

代码随想录算法训练营 动态规划part08

一、单词拆分 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 将字符串 s 长度记为 n&#xff0c;wordDict 长度记为 m。为了方便&#xff0c;我们调整字符串 s 以及将要用到的动规数组的下标从 1 开始。 定义 f[i] 为考虑前 i 个字符&#xff0c;能否使用 wordDict 拼…

linux进程杀不死

项目场景&#xff1a; 虚拟机 问题描述 linux进程杀不死 无反应 原因分析&#xff1a; 进程僵死zombie 解决方案&#xff1a; 进proc或者find命令找到进程所在地址 cat status查看进程杀死子进程

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出 目录 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出&#xf…

Otter改造 增加springboot模块和HTTP调用功能

环境搭建 & 打包 环境搭建&#xff1a; 进入 $otter_home/lib 目录执行&#xff1a;bash install.sh 打包&#xff1a; 进入$otter_home目录执行&#xff1a;mvn clean install -Dmaven.test.skip -Denvrelease发布包位置&#xff1a;$otter_home/target 项目背景 阿里…

「大数据-0」虚拟机VMware安装、配置、使用、创建大数据集群教程

目录 一、下载VMware Wworkstation Pro 16 二、安装VMware Wworkstation Pro 16 三、检查与设置VMware的网卡 1. 检查 2. 设置VMware网段 四、在VMware上安装Linux虚拟机 五、对安装好的虚拟机进行设置 1. 打开设置 2. 设置中文 3. 修改字体大小 4. 修改终端字体大小 5. 关闭虚…

十、性能测试之数据库测试

性能测试之数据库测试 一、 数据库分类二、 mysql安装及密码的修改1、安装&#xff1a;数据库的版本 mysql5.7版方法1&#xff1a;直接安装方法2&#xff1a;使用rpm包安装方法3&#xff1a;docker方式安装 2、修改数据库的密码3、创建库4、创建表 三、存储引擎1、InnoDB特点 2…

进入数据结构的世界

数据结构和算法的概述 一、什么是数据结构二、什么是算法三、如何去学习数据结构和算法四、算法的时间复杂度和空间复杂度4.1 算法效率4.2 大O的渐进表示法4.3 时间复杂度4.4 空间复杂度4.5 常见复杂度对比 一、什么是数据结构 数据结构是计算机存储、组织数据的方式。&#x…

java框架-Springboot3-基础特性+核心原理

文章目录 java框架-Springboot3-基础特性核心原理profiles外部化配置生命周期监听事件触发时机事件驱动开发SPISpringboot容器启动过程自定义starter java框架-Springboot3-基础特性核心原理 profiles 外部化配置 生命周期监听 事件触发时机 事件驱动开发 Component public c…

Hana SQL Format 的希望

以前一直吐槽Hana Sql 无法进行代码格式化&#xff0c;没有abap code的pretty print功能&#xff0c;对运维和理解代码来说都很不方便。这个情况在abap cleaner里得到改善。 现阶段他们abap的美化做的比原始的pretty print还要好&#xff0c;我基本已经不用pretty print&#x…

获取文件上次访问时间

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Java源码 public void testGetFileTime() {try {String string "E://test.txt";File file new File(string);Path path file.toPath();BasicFileAttributes ba…

TypeScript- 对于对象键名(包括函数键值)不确定的接口,可以使用字符串索引的形式

AXIOS树配置项 有一个需求&#xff0c;通过JSON数据&#xff0c;第一层是对应的页面对象&#xff08;比如是用户页面&#xff09;&#xff0c;第二层是该页面的API请求名&#xff08;比如用户的增删改查&#xff09;&#xff0c;第三层是该API的配置信息&#xff08;比如&…

系统安装(一)CentOS 7 本地安装

CentOS与Ubuntu并称为Linux最著名的两个发行版&#xff0c;但由于笔者主要从事深度学习图像算法工作&#xff0c;Ubuntu作为谷歌和多数依赖库的亲儿子占据着最高生态位。但最近接手的一个项目里&#xff0c;甲方指定需要在CentOS7上运行项目代码&#xff0c;笔者被迫小小cos了一…

scikit-learn机器学习算法封装

K近邻算法 K-最近邻&#xff08;KNN&#xff09;是一种有监督的机器学习算法&#xff0c;可用于解决分类和回归问题。它基于一个非常简单的想法&#xff0c;数据点的值由它周围的数据点决定。考虑的数据点数量由k值确定。因此&#xff0c;k值是算法的核心。 我们现在已经知道。…

mac安装chromedriver驱动详细步骤

1.查看浏览器版本 2.下载驱动 3.安装驱动 4.MacOS无法打开“chromedriver”&#xff0c;因为无法验证开发者 1.查看浏览器版本 在这里插入图片描述 2.下载驱动 下载驱动地址&#xff1a;链接: http://chromedriver.storage.googleapis.com/index.html. 下载和浏览器版本一致的…