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

基于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.rhkb.cn/news/382228.html

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

相关文章

【数据挖掘】词云分析

目录 1. 词云分析 2. Python 中的 WordCloud 库 1. 词云分析 词云(Word Cloud)是数据可视化的一种形式,主要用于展示文本数据中单词的频率和重要性。它具有以下几种主要用途和意义: 1. 文本分析 • 识别关键主题:通…

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之一 [ 如何寻找大型数据集 ] / [ 构建词元分析器 ] 的简单整理

AGI 之 【Hugging Face】 的【从零训练Transformer模型】之一 [ 如何寻找大型数据集 ] / [ 构建词元分析器 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【从零训练Transformer模型】之一 [ 如何寻找大型数据集 ] / [ 构建词元分析器 ] 的简单整理 一、简单介绍 二、Transf…

数据结构day6

一、思维导图 二、模拟面试 typedef定义函数指针的方式typedef int(*p)(int,int);对void*指针的理解,相关应用万能指针,可以定义形参用来接收任意类型的指针变量,也可以定义函数用来返回任意类型的指针变量例如malloc函数在堆区申请内存&…

组队学习——支持向量机

本次学习支持向量机部分数据如下所示 IDmasswidthheightcolor_scorefruit_namekind 其中ID:1-59是对应训练集和验证集的数据,60-67是对应测试集的数据,其中水果类别一共有四类包括apple、lemon、orange、mandarin。要求根据1-59的数据集的自…

NPS配置域名访问本地应用

架构简易说明: 阿里云云服务器一台:NPS服务端 本地Linux服务器一台:NPS客户端,支持互联网 域名一个:解析到云服务器 1.在nps后台配置TCP隧道信息 其中,服务端口为云服务器的端口 ,不要与已存…

Linux ls命令详解

学习 Linux ,本质上是学习在命令行下熟悉使用 Linux 的各类命令; 1. Linux 命令通用格式 命令格式:命令 【-选项】【参数】(个别命令不遵循该格式) 短线(-)是区分选项和参数的标志,选项用来调整命令的功能…

陶德:边种田边写代码,3年300万行,一个人写出了“国产大满贯QT”

这是《开发者说》的第12期,本期我们邀请的开发者是陶德,从小在国企矿山里长大,计算机成绩是文科班里最差的一个,毕业两年找不到工作,睡过公园,讨过剩饭,用打魔兽世界的方式磨炼技术,…

PYTHON学习笔记(四、pyhton数据结构--列表)

(1)list列表 列表的含义是指:(1)一系列的按特定顺序排列的元素组成。(2)python中内置的可变序列。(3)在python中使用[]定义列表,元素与元素之间使用英文的逗…

数据结构 day4

目录 思维导图: 学习内容: 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

【手撕数据结构】拿捏单链表

目录 单链表介绍链表的初始化打印链表增加节点尾插头插再给定位置之后插入在给定位置之前插入 删除节点尾删头删删除给定位置的节点删除给定位置之后的节点 查找节点 单链表介绍 单链表也叫做无头单向非循环链表,链表也是一种线性结构。他在逻辑结构上一定连续&…

展望未来:利用【Python】结合【机器学习】强化数据处理能力

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 一、引言二、数据清洗与预处理三、特征工程四、数据可视化五、模型训练与评估六、模型部署与优化七、总结 在数据驱动的时代,数据处理与机器学习技术的结合已成为推动业务增长和创新的关键…

Redis 7.x 系列【25】集群部署

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 配置文件2.1 cluster-enabled2.2 cluster-config-file2.3 cluster-node-tim…

HAL库源码移植与使用之RTC时钟

实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。 普通定时器无法掉电运行!但RTC可由VBAT备用电源供电,断电不断时 这里讲F1系列的RTC 可以产生三个中断信号&#xff…

TYPE-C接口PD取电快充协议芯片ECP5701:支持PD 2.0和PD 3.0(5V,9V,12V,15V,20V)

随着智能设备的普及,快充技术成为了越来越多用户的刚需。而TYPE-C接口作为新一代的USB接口,具有正反插、传输速度快、充电体验好等优点,已经成为了快充技术的主要接口形式。而TYPE-C接口的PD(Power Delivery)取电快充协…

poi库简单使用(java如何实现动态替换模板Word内容)

目录 Blue留言: Blue的推荐: 什么是poi库? 实现动态替换 第一步:依赖 第二步:实现word模板中替换文字 模板word: 通过以下代码:(自己建一个类,随意取名&#xf…

[排序]hoare快速排序

今天我们继续来讲排序部分,顾名思义,快速排序是一种特别高效的排序方法,在C语言中qsort函数,底层便是用快排所实现的,快排适用于各个项目中,特别的实用,下面我们就由浅入深的全面刨析快速排序。…

JVM监控及诊断工具-命令行篇--jcmd命令介绍

JVM监控及诊断工具-命令行篇5-jcmd:多功能命令行 一 基本情况二 基本语法jcmd -ljcmd pid helpjcmd pid 具体命令 一 基本情况 在JDK 1.7以后,新增了一个命令行工具jcmd。它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能…

简历网站分享

作者本人自己编写了一个简历站点,分享给大家。在线链接 , github仓库

从PyTorch官方的一篇教程说开去(3.3 - 贪心法)

您的进步和反馈是我最大的动力,小伙伴来个三连呗!共勉。 贪心法,可能是大家在处理陌生问题时候,最容易想到的办法了吧? 还记得小时候,国足请了位洋教练发表了一句到现在还被当成段子的话:“如…

【深入C++】map和set的使用

文章目录 C 中的容器分类1. 顺序容器2. 关联容器3. 无序容器4. 容器适配器5. 字符串容器6. 特殊容器 set1.构造函数2.迭代器3.容量相关的成员函数4.修改器类的成员函数5.容器相关操作的成员函数 multiset1.equal_range map1.初始化相关的函数2.迭代器3.容量相关的成员函数4.访问…