使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题

news2024/11/14 4:19:47

基于session实现登录流程

1.发送验证码

用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号

如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户

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

3.校验登录状态

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

这段话的大概意思是什么呢:用户请求的时候,会从cookie中携带JsessionId到后台,就如图一样去看这个键值对,键=值,根据这个值去查找这个用户信息,没有这个session信息,就拦截,有就将用户信息保存到threadLocal里面,放行

ThreadLocal可以解释成线程的局部变量,也就是说一个ThreadLocal的变量只有当前自身线程可以访问,别的线程都访问不了

我们从浏览器输入框键入网址,首先浏览器做的第一步工作就是要对 URL 进行解析,从而生成发送给 Web 服务器的请求信息。服务器就帮我去请求这个信息,就是先去问dns

(dns域名解析:看图

首先本地电脑会检查浏览器缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。 如果浏览器缓存中没有数据,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。前两个过程无法解析时,就要用到我们网络配置中的"DNS服务器地址"了。操作系统会把这个域名发送给这个本地DNS服务器。如果本地DNS服务器仍然没有命中,就直接到根DNS服务器请求解析。根DNS服务器返回给本地DNS域名服务器一个顶级DNS服务器地址,它是国际顶级域名服务器,如.com、.cn、.org等, 本地DNS服务器再向上一步获得的顶级DNS服务器发送解析请求。诶没有顶级DNS服务器就让他去问权威DNS服务器,权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。)

通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。

http协议是处于TCP/IP协议的体系的应用层,它属于应用层的协议

session的数据是存储于服务器端的,服务端的数据量非常大的时候,就容易造成内存不足

redis是基于内存的高性能数据库,他的读写速率非常快和session相似

Cookie的工作原理

(1)浏览器端第一次发送请求到服务器端

(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端

(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie

(4)服务器端通过Cookie中携带的数据区分不同的用户

Session的工作原理

(1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端

(2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象

(3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。

name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie

name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象

value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie

value为SessionId存在,返回session对象

DTO:

接受前端数据传输给service层

service层传输数据给前端数据

中间就是要通过cotrooer层

用于服务层之间数据传输。

包含数据对象,主要是变量定义和get、set方法。

dto可以封装需要传输的数据。

VO:

在controller层将数据传递给前端展示。

fillBeanWithMap的意思就是这个

我们想redis存入的是hash

如果我们要将信息存入ThreadLocal中的话,那么就要将map转为bean

Session集群共享问题

如何解决集群的session共享问题?

用redis替代session实现登录注册功能啊,分布式系统下每一个服务器的session都是独立的,就是说你切换到其他服务器,比如你要切换到发布帖子,查看评论什么的,再次调回来登录界面又要重新登录了,多次重复登录多麻烦啊,这得使用redis可以保证多个服务器访问的是同一个redis,则保证了不会再重复登录了,实现了数据的共享;

为什么redis能解决集群的session共享问题?

先说一下Session集群共享问题造成哪些问题?

比如:在当前这个服务器上用户已经完成了登录,Session中存储了用户的信息,能够判断用户已登录,但是在另一个服务器的Session中没有用户信息,无法调用显示没有登录的服务器上的服务

为什么会出现这种情况??

如图:

拿session来说,一个用户它去B服务器登录注册,B服务器上保存了它的信息,此时正在向A,C服务器同步信息,但是此时诶,浏览器关了或者跑到其他页面去了,回来到C服务器登录注册页面的时候,发现没有登录成功还要再重复登录一次。因为B服务器并没有成功的向A,C服务器同步用户的信息。

这个时候需要redis替代session实现登录注册功能

就前面校验登录状态:(用户在请求的时候,会从cookie中携带JsessionId到后台,去看那个键值对,后台通过JsessionId从session中拿到用户信息,如果没有session信息,则进行拦截(就是登录不成功),如果有session信息,则将用户信息保存到threadLocal中,并放行(登录成功))这个原理来说,使用redis可以保证多个服务器访问的是同一个redis(因为用户在B服务器上保存的信息其实已经保存在redis里面了,其他服务器都可以来访问redis里面的信息,来查找session信息,看有没有他们想要的信息,大概意思就是这样)

Redis缓存相较于传统Session存储的优点:(记一下就行)

高性能和可伸缩性:Redis 是一个内存数据库,具有快速的读写能力。相比于传统的 Session 存储方式,将会话数据存储在 Redis 中可以大大提高读写速度和处理能力。此外,Redis 还支持集群和分片技术,可以实现水平扩展,处理大规模的并发请求。

可靠性和持久性:Redis 提供了持久化机制,可以将内存中的数据定期或异步地写入磁盘,以保证数据的持久性。这样即使发生服务器崩溃或重启,会话数据也可以被恢复。

丰富的数据结构:Redis 不仅仅是一个键值存储数据库,它还支持多种数据结构,如字符串、列表、哈希、集合和有序集合等。这些数据结构的灵活性使得可以更方便地存储和操作复杂的会话数据。

分布式缓存功能:Redis 作为一个高效的缓存解决方案,可以用于缓存会话数据,减轻后端服务器的负载。与传统的 Session 存储方式相比,使用 Redis 缓存会话数据可以大幅提高系统的性能和可扩展性。

可用性和可部署性:Redis 是一个强大而成熟的开源工具,有丰富的社区支持和活跃的开发者社区。它可以轻松地与各种编程语言和框架集成,并且可以在多个操作系统上运行。

双重拦截器

配置登录拦截器:

原理就是上面 的“3.校验登录状态”

还需要单独配置一个拦截器用户刷新Redis中的token:

我们之前只配置了一个登录拦截器,这里需要另外再配置一个拦截器专门用户刷新存入Redis中的token,因为我们现在改用Redis了,为了防止用户在操作网站时突然由于Redis中的 token 过期,导致直接退出网站,严重影响用户体验。那为什么不把刷新的操作放到一个拦截器中呢,因为之前的那个拦截器只是用来拦截一些需要进行登录校验的请求,对于哪些不需要登录校验的请求是不会走拦截器的,刷新操作显然是要针对所有请求比较合理,所以单独创建一个拦截器拦截一切请求,刷新Redis中的Key

然后将自定义的拦截器添加到SpringMVC的拦截器表中,使其生效

啊大概先到这了,后续有补充的会继续补充上去。

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

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

相关文章

Python爬虫实战案例(爬取图片)

爬取图片的信息 爬取图片与爬取文本内容相似,只是需要加上图片的url,并且在查找图片位置的时候需要带上图片的属性。 这里选取了一个4K高清的壁纸网站(彼岸壁纸https://pic.netbian.com)进行爬取。 具体步骤如下: …

Android 性能之刷新率设置和管理

目录 1. 刷新率和帧率 2. 多种刷新率 3. 基本原理 3.1 屏幕 & 显示控制器 3.2 Composer Service 4. Framework 策略 4.1基本架构 4.2 刷新率设置项的定义 4.2.1 最低刷新率 4.2.2 默认刷新率 & 默认的用户设置刷新率 4.2.2.1 设置入口 4.2.2.2 设置场景 4…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

zigbee DL-20无线串口模块(电赛备战)

zigbee DL-20无线串口模块(电赛备战) 备战2024电子设计大赛(7.29-8.1) 概述 DL-20是一款2.4G无线串口模块,支持点对点和广播模式的通信。它具备低数据丢失率、宽电压范围和高传输速率的特点,适用于多种无线通信场景。 在电赛中&…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…

googleTest 源码主线框架性分析

本文备忘一个主题的分析过程和结论,即,googleTest框架中是如何调用相关的测试宏的? TEST TEST_F TEST_P 等等 1,googleTest 环境与简单示例 1.1 下载 googletest 并编译 下载: $ git clone https://github.com/goog…

5 C 语言数组与字符串的全面解析

目录 1 数组的概念与特性 1.1 什么是数组 1.2 数组的特点 1.3 数组的用途 2 一维数组的定义与初始化 2.1 一维数组的定义 2.2 声明与定义的区别 2.3 一维数组的多种初始化 3 数组名的命名规则与作用 3.1 数组名的命名规则 3.2 数组名的作用 4 一维数组在内存中的存…

实战篇(十二):如何使用 Processing 创建一个多功能的简易吃豆人游戏

如何使用 Processing 创建一个多功能的简易吃豆人游戏 文章目录 如何使用 Processing 创建一个多功能的==简易==吃豆人游戏引言准备工作第一步:设置基本框架第二步:创建 Pacman 类第三步:创建 Obstacle 类第四步:添加分数系统第五步:运行游戏完整代码结论参考资料引言 吃…

Python基础知识——(005)

文章目录 P21——20. 比较运算符 P22——21. 逻辑运算符 P23——22. 位运算和运算符的优先级 P24——23. 本章总结和章节习题 P21——20. 比较运算符 示例3-17—比较运算符的使用: P22——21. 逻辑运算符 示例3-18—逻辑运算符的使用: print(True and T…

van-dialog 组件调用报错

报错截图 报错原因 这个警告表明 vue 在渲染页面时遇到了一个未知的自定义组件 <van-dialog>&#xff0c;并且提示可能是由于未正确注册该组件导致的。在 vue 中&#xff0c;当我们使用自定义组件时&#xff0c;需要先在 vue 实例中注册这些组件&#xff0c;以便 vue 能…

基于关键字驱动设计Web UI自动化测试框架!

引言 在自动化测试领域&#xff0c;关键字驱动测试&#xff08;Keyword-Driven Testing, KDT&#xff09;是一种高效且灵活的方法&#xff0c;它通过抽象测试用例中的操作为关键字&#xff0c;实现了测试用例与测试代码的分离&#xff0c;从而提高了测试脚本的可维护性和可扩展…

5.Fabric的共识机制

在Fabric中,有以下3中典型共识机制。 Solo共识 solo共识机制只能用于单节点模式,即只能有一个Orderer节点,因此,其共识过程很简单,每接收到一个交易信息,就在共识模块的控制下产生区块并广播给节点存储到账本中。 Solo 模式下的共识只适用于一个Orderer节点,所以可以在…

AI 驱动下的一体化分布式数据库:滴滴、快手、中国恩菲、好未来、翼鸥教育共话创新应用实践|OceanBase Meetup 精彩回顾

7月6日&#xff0c;OceanBase Meetup 北京站——“AI 驱动下的一体化分布式数据库&#xff1a;跨行业多场景的创新应用与实战”举办。来自滴滴、快手、中国恩菲、好未来、翼鸥教育、蚂蚁集团及OceanBase等众多行业技术专家与资深用户&#xff0c;围绕众多用户关注的AI 与数据库…

Performance Metrics in Evaluating Stable Diffusion Models

1.Performance Metrics in Evaluating Stable Diffusion Models 笔记来源&#xff1a; 1.Performance Metrics in Evaluating Stable Diffusion Models 2.Denoising Diffusion Probabilistic Models 3.A simple explanation of the Inception Score 4.What is the inception s…

【LLM】-05-提示工程-部署Langchain-Chat

目录 1、软硬件要求 1.1、软件要求 1.2、硬件要求 1.3、个人配置参考 2、创建cuda环境 3、下载源码及模型 4、配置文件修改 5、初始化知识库 5.1、训练自己的知识库 6、启动 7、API接口调用 7.1、使用openai 参考官方wiki&#xff0c;本文以Ubuntu20.04_x64&#xf…

揭秘!电源炼成记:从基础原理到高端设计的全面解析

文章目录 初始构想&#xff1a;需求驱动设计原理探索&#xff1a;选择适合的拓扑结构精细设计&#xff1a;元器件选型与布局环路稳定&#xff1a;控制策略与补偿网络严格测试&#xff1a;验证与优化持续改进&#xff1a;创新与技术迭代《硬件十万个为什么&#xff08;电源是怎样…

云计算实训11——web服务器的搭建、nfs服务器的搭建、备份静态文件、基于linux和windows实现文件共享

一、搭建web服务器 1.关闭firewall和selinux 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 停用selinux setenforce 0 配置文件中让sellinux不再启动 vim /etc/selinux/config SELINUXpermissive 2.编辑dns配置文件 vim /etc/resolv.conf nameserver 114.…

Sql Server缓冲池、连接池等基本知识(附Demo)

目录 前言1. 缓存池2. 连接池3. 彩蛋 前言 基本的知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;Mysql底层原理详细剖析常见面试题&#xff08;全&#xff09; 1…

【深度学习入门篇 ⑪】自注意力机制

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

基于微信小程序+SpringBoot+Vue的大学生科技竞赛管理系统(带1w+文档)

基于微信小程序SpringBootVue的大学生科技竞赛管理系统(带1w文档) 基于微信小程序SpringBootVue的大学生科技竞赛管理系统(带1w文档) 本系统中采用的开发工具包括软件工具和硬件工具&#xff0c;软件采用了Java语言和MySQL数据库&#xff0c;利用微信小程序技术&#xff0c;框架…