redis实战-短信登录

基于session的登录流程

session的登录流程图

在这里插入图片描述

1. 发送验证码

用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号
如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户

2. 短信验证码登录、注册

用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息

3. 校验登录状态

用户在请求的时候,会从cookie中携带JsessionId到后台,后台通过JsessionId从session中拿到用户信息,如果没有session信息,则进行拦截,如果有session信息,则将用户信息保存到threadLocal中,并放行

登录拦截

为什么需要登录拦截

当执行不同的业务,访问各个controller层时,不可能在每个controller里面写检验登录状态的业务逻辑,在spring mvc中有拦截器,所有请求先经过拦截器,由拦截器决定是否需要放行,到达controller。这样校验只需要一次。在拦截器里获取到的用户信息通过threadlocal传递到controller。
在这里插入图片描述

隐藏用户敏感信息

用户信息若是直接返回,会得到许多我们不需要的信息。
所以我们应当在返回用户信息之前,将用户的敏感信息进行隐藏,采用的核心思路就是书写一个UserDto对象,这个UserDto对象就没有敏感信息了,我们在返回前,将有用户敏感信息的User对象转化成没有敏感信息的UserDto对象,那么就能够避免这个尴尬的问题了

session共享问题

每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第二台服务器上,肯定没有第一台服务器存放的session,所以此时 整个登录拦截功能就会出现问题,我们能如何解决这个问题呢?

早期的方案是session拷贝,就是说虽然每个tomcat上都有不同的session,但是每当任意一台服务器的session修改时,都会同步给其他的Tomcat服务器的session,这样的话,就可以实现session的共享了

但是这种方案具有两个大问题

  1. 每台服务器中都有完整的一份session数据,服务器压力过大。
  2. session拷贝数据时,可能会出现延迟

所以我们后面都是基于Redis来完成,我们把session换成Redis,Redis数据本身就是共享的,就可以避免session共享的问题了

Redis替代session的登录流程

设计key结构

首先我们来思考一下该用什么数据结构来存储数据
由于存入的数据比较简单,我们可以使用String或者Hash
如果使用String,以JSON字符串来保存数据,会额外占用部分空间
如果使用Hash,则它的value中只会存储数据本身
如果不是特别在意内存,直接使用String就好了

设计key的具体细节

我们这里就采用的是简单的K-V键值对方式
但是对于key的处理,不能像session一样用phone或code来当做key
因为Redis的key是共享的,code可能会重复,phone这种敏感字段也不适合存储到Redis中
在设计key的时候,我们需要满足两点
key要有唯一性
key要方便携带
所以我们在后台随机生成一个token,然后让前端带着这个token就能完成我们的业务逻辑了

整体访问流程

当注册完成后,用户去登录,然后校验用户提交的手机号/邮箱和验证码是否一致
如果一致,则根据手机号查询用户信息,不存在则新建,最后将用户数据保存到Redis,并生成一个token作为Redis的key
当我们校验用户是否登录时,回去携带着token进行访问,从Redis中获取token对应的value,判断是否存在这个数据
如果不存在,则拦截
如果存在,则将其用户信息(userDto)保存到threadLocal中,并放行
在这里插入图片描述
在这里插入图片描述

登录刷新问题

什么是登录状态刷新问题

我们依赖于拦截器做登录校验,需求是只要用户一直访问,token有效期就一直刷新,不会过期,但是我们拦截器拦截的路径只是需要做登录校验的路径,并不是所有路径,一个服务中存在不需要登录校验的操作(如首页等),如果用户进行不需要登录校验的请求,token的有效期不会刷新。
在这里插入图片描述

优化方案

类似责任链模式的思想,在原有拦截器的基础上,加一个拦截器,拦截一切路径,在第一个拦截器中做刷新token有效期的操作。
在这里插入图片描述
既然之前的拦截器无法对不需要拦截的路径生效,那么我们可以添加一个拦截器,在第一个拦截器中拦截所有的路径,把第二个拦截器做的事情放入到第一个拦截器中,同时刷新令牌,因为第一个拦截器有了threadLocal的数据,所以此时第二个拦截器只需要判断拦截器中的user对象是否存在即可,完成整体刷新功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第七天|模型训练

背景 提供免费算力支持,有交流群有值班教师答疑的华为昇思训练营进入第七天了。 今天是第七天,前六天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图&#xff1a; 2、外部中断1框图&#xff1a; 3、程序举例&#xff1a; #include <REG51.h> //包含头文件REG51.h,使能51内部寄存器; #include <intrins.h> //包含头文件intrins.h,要放在stdio.h的头文件之前; //使能…

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索

基准测试程序的认知与分析 —— SPEC基准测试程序集的深入探索 一、实验目的&#xff1a; 了解和掌握Spec基准程序测试对基准程序测试结果进行分析和比较 二、实验准备知识&#xff1a; 计算机系统设计和分析的量化原则。 计算机系统设计和分析的量化原则是指导计算机系统架…

一篇就够了,为你答疑解惑:锂电池一阶模型-离线参数辨识(附代码)

锂电池一阶模型-参数离线辨识 背景模型简介数据收集1. 最大可用容量实验2. 开路电压实验3. 混合动力脉冲特性实验离线辨识对应模型对应代码总结下期预告文章字数有点多,耐心不够的谨慎点击阅读。 下期继续讲解在线参数辨识方法。 背景 最近又在开始重新梳理锂电池建模仿真与S…

【保姆级教程+配置源码】在VScode配置C/C++环境

目录 一、下载VScode 1. 在官网直接下载安装即可 2. 安装中文插件 二、下载C语言编译器MinGW-W64 三、配置编译器环境变量 1. 解压下载的压缩包&#xff0c;复制该文件夹下bin目录所在地址 2. 在电脑搜索环境变量并打开 3. 点击环境变量→选择系统变量里的Path→点击编…

羊了个羊:羊、羊、羊

一、I am me&#xff0c;羊羊羊 英文中的 我就是我&#xff08;I am me&#xff09;&#xff0c;其实就是&#xff1a;羊 羊 羊&#xff0c;为什么会有这么一个结论呢&#xff1f; 请往下看&#xff1a; I&#xff0c;就是羊 am&#xff08;是&#xff09;&#xff0c;也是羊 …

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法&#xff1f; 需求&#xff1a;业务高峰期&#xff0c;生产环境的 MySQL 压力太大&#xff0c;没法正常响应&#xff0c;需要短期内、临时性地提升一些性能 短连接风暴 短连接模式&#xff1a;执行很少的 SQL 语句就断开&#xff0c;…

等保测评练习卷15

等级保护初级测评师试题15 姓名&#xff1a; 成绩&#xff1a; 判断题&#xff08;10110分&#xff09; 1. 防火墙应关闭不需要的系统服务、默认共享和高危端口&#xff0c;可以有效降低系统遭受攻击的可能性。&am…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级&#xff0c;就要学会进行整理维护电脑 基于小白用户&#xff0c;每一个操作点我都会在后续整理出流程&#xff0c;软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改&#xff0c;也希望有补充告诉我&#xff0c;我…

【数据结构】详解二叉树之堆

失败只是暂时停止成功&#xff0c;假如我不能&#xff0c;我就一定要&#xff1b;假如我要&#xff0c;我就一定能&#xff01;&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;树的概念和结构 • &#x1f330;1.什么是树&#x…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理&#xff1f; 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能的一个重要分支&#xff0c;旨在让计算机理解、解释和生成人类的自然语言。打个比方&#xff0c;你和Siri对话&#xff0c;或使用谷歌翻译翻译一…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

正版软件 | R-Studio T80+:数据恢复与取证分析的专业之选

在数据恢复和数字取证领域&#xff0c;专业人士需要一款强大、可靠的工具来应对复杂和高要求的任务。R-Studio T80 由 R-TT 公司推出的新型许可软件&#xff0c;以其年度付费订阅模式&#xff0c;为专家提供了成本效益更高的解决方案。 全面功能&#xff0c;专业服务 R-Studio …

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

2,linux服务器使用学习

目录 服务器使用-SSH 介绍 使用 OpenSSH-Linux FinalShell-Windows 阿里云服务器使用示例 领取免费账号 进行登录 服务器使用-SSH 介绍 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…