Redis 实现分布式Session 登录相关细节

Redis 实现分布式Session 登录

借助 Redis 对 Session 信息进行统一的存储和管理,这样无论请求发送到哪台服务器,服务器都会去同一个 Redis 获取相关的 Session 信息,这样就解决了分布式系统下 Session 存储的问题。

  1. 【发送短信】校验手机号,如果校验手机号格式正确,那么就生成一个六位随机数字验证码,然后把这个六位数保存到 Redis 中,key 设置为业务前缀+手机号,value 就是 String 类型的随机数验证码,设定验证码的有效时间(2-3 分钟)防止这个 redis 中的数据越存越多。最后将验证码返回给前端。
  2. 【登录和注册】接下来用户输入手机号和验证码登录。登录时先校验手机号格式,校验格式通过后,之后根据前端发来的手机号(手机号就是 redis 中的 key 的一部分)从 redis 中获取验证码。
    a. 如果验证码一致(redis 保存的和用户输入的一致),那么就根据手机号去数据库查找用户是否存在。
    ⅰ. 如果数据库中有该用户,保存用户信息到 redis(便于后面逻辑的判断 比如登录判断、随时取用户信息,减少对数据库的查询)
    1. 随机生成一个 token(使用 UUID+一些业务前缀) 作为登录令牌,作为 redis 中的 key。
    2. 存储用户信息。【putall 方法】参数: key=token, Map(哈希表)。即以 Hash 存储到 redis
    3. 存储的时候也不能一直存一直存,需要设计用户信息的有效期,一段时间后就清除内存。
    4. 将这个 token 返回给客户端存储,以后每次发送请求的时候客户端就会携带。
      ⅱ. 如果数据库中没有该用户,那就创建新用户(补充一些用户名昵称之类的),保存到用户数据库,之后保存用户信息到 redis。
      b. 如果验证码不一致,返回失败,需要重新提交验证码手机号。
  3. 相当于之后用户的登录凭证就是 redis 中的 key(token) ,登录之后浏览器每次发送请求时,请求头就会携带含有 token 的 Cookie。那么服务端收到之后就可以通过 token 得到 redis 中存储的 value,如果得到了 value 就可以判断为登陆成功。
  4. 【后续请求时校验登录状态】后续的请求都会携带 cookie:token,通过 interceptor1 拦截器 1 拦截所有请求,之后获取 token,从而获取 redis 中的用户信息。如果成功获取到了,那么就将用户信息保存到 TreadLocal 中,然后刷新 token 有效期,之后放行。如果没有获取到用户信息,那么就直接放行(交给第二个拦截器处理)。
    之后通过 interceptor2 拦截器 2 拦截需要登录的路径,如果从 TreadLocal 中查询到用户,那么就放行,如果没查到,那么就拦截。那些不需要登录就能访问的东西,就不会被拦截了。

采用 Redis 里面的 Hash 数据结构存储:

● 对象的 String 数据结构是以 JSON 字符串的形式保存,更加直观,操作也更加简单,但是 JSON 结构会有很多非必须的内存开销,比如双引号、大括号,内存占用比 Hash 更高
● Hash 数据结构是以 Hash 表,也就是 hashkey-value 的形式保存,可以对单个字段进行CRUD更加灵活

为什么已经存在 redis 中了还需要存到 treadlocal?

  1. 减少服务器的交互,提升性能,
  2. 方便后续逻辑处理,比如:方便获取和使用用户信息,Redis获取用户信息是具有侵入性的

视频软件如何维护登录状态?

那就直接设计一个过期时间很久的 jwt,或者返回的时候制定 cookie 过期时间(这样 cookie 就会存在磁盘中,关闭浏览器也不会失去 cookie)。

JWT 如何设置过期时间?

JWTS 工具类里面setExpiration 设置。还需设置 header 中的签名算法,签名密钥。设置有效载荷 claims 等

什么时候用 JWT 什么时候用 cookie session?

session+cookies是基于web的,移动端用不了 cookie,所以移动端一些 api 用 jwt,开发 web 应用的话都可以。

Cookie Session JWT 会话跟踪技术对比

会话:

在 web 开发中,浏览器和服务器之间的一次连接就称之为会话。只要浏览器和服务器不断开连接,那么就是属于一个会话。那么如果一个浏览器在未关闭之前请求了多次服务器,那么这些请求属于同一个回话。

会话跟踪:

就是一种维护浏览器状态的方法。我们后端服务器需要识别多次请求是否来自于同一个浏览器,从而实现在多次请求之间共享数据。从而解决 HTTP 协议是无状态的协议的问题,去辨别多次请求是否属于同一个会话,从而在一次会话的多次请求之间共享数据。

Cookie 数据存储在浏览器(客户端会话跟踪技术)

比如第一次请求登录接口,顺利通过登录校验完成之后,我们就可以设置一个cookie【HttpServletResponse 的 addCookie 方法】在 cookie 当中我们可以来存储用户相关的一些数据信息。比如我可以在 cookie 当中来存储当前登录用户的用户名,用户的ID 等等。
服务器端在给客户端响应数据的时候,会将 cookie 响应给浏览器(放在响应头 Set-Cookie 中),浏览器接收到响应回来的 cookie 之后,会自动的将 cookie 的值存储在浏览器本地。接下来在后续的每一次请求当中,都会将浏览器本地所存储的 cookie 自动地携带到服务端(放在请求头 Cookie 中)。
接下来在服务端我们就可以去获取 cookie 。【HttpServletResponse 的 getCookie 方法】判断这个 cookie 中的值是否存在,如果不存在这个cookie,就说明客户端之前是没有访问登录接口的,那后续的页面也就不能被访问,只能让他访问登录界面;如果存在 cookie 的值,就说明客户端之前已经登录完成了。这样我们就可以基于 cookie 在同一次会话的不同请求之间来共享数据。
优点:是 HTTP 中支持的技术,浏览器对于 Cookie 的自动发送和接受存储都是自动的,不需要我们手动操作
缺点:

  1. 移动端的 APP 无法使用 cookie
  2. 不是很安全因为用户可以自己禁用 cookie
  3. 跨域的话不能用 cookie(协议,IP地址,端口三者缺一就是跨域)

Session 数据存储在服务器(服务端会话跟踪技术)

比如浏览器第一次请求服务器的时候,这时候服务器会创建一个会话对象 Session,可以往 Session 中存储一些数据,且每一个会话对象都有一个 JsessionID。【HttpSession 的 setAttribute()方法】
接下来服务器在给浏览器相应数据的时候,就会把 Session 的 ID 通过 Cookie 响应给浏览器(放在响应头 Set-Cookie 中,cookie 的名字是固定的 JsessionID ——代表的服务器端会话对象 Session 的 ID)浏览器会自动识别这个响应头,然后将 Cookie 存在浏览器本地。
接下来,在后续的每一次请求当中,都会将 Cookie 携带到服务端(放在请求头 Cookie 中)。服务器拿到 JSESSIONID 这个 Cookie 的值,也就是 Session 的ID。拿到 ID 之后,就会从众多的 Session 当中来找到当前请求对应的会话对象Session。【HttpSession 的 getAttribute() 方法】
这样就可以 通过 Session 会话对象,在同一次会话的多次请求之间来共享数据了
优点: Session 是存储在服务端的,安全
缺点:
1.服务器集群不能直接用 Session。请求->负载均衡服务器->后端服务器 tomcat 集群
2.还有 Cookie 的问题:
a. 不能跨域(IP 地址,端口号,协议)
b. 用户可以自己禁用 Cookie
c. 移动端不能用 Cookie

令牌技术

令牌,其实它就是一个用户身份的标识,其实本质就是一个字符串。
在请求登录接口的时候,如果登录成功,我就可以生成一个令牌,令牌就是用户的合法身份凭证。接下来我在响应数据的时候,我就可以直接将令牌响应给前端。
前端程序接收到令牌之后,就需要将这个令牌存储起来。这个存储可以存储在 cookie 当中,也可以存储在其他的存储空间(比如:localStorage)当中。
接下来,在后续的每一次请求当中,都需要将令牌携带到服务端。携带到服务端之后,接下来我们就需要来校验令牌的有效性。如果令牌是有效的,就说明用户已经执行了登录操作,如果令牌是无效的,就说明用户之前并未执行登录操作。
如果是在同一次会话的多次请求之间,我们想共享数据,只需要将共享的数据存储在令牌当中就可以了。
优点:1. 支持 PC 端 支持移动端
2. 解决了集群环境下的认证问题(因为不需要在服务器端存储数据)
3. 减轻了服务器的存储压力(令牌存储在客户端)
缺点:1. 需要自己实现令牌的生成,令牌的传递,令牌的校验

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

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

相关文章

自定义 Dockerfile 构建 PostgreSQL 15 编译版 Docker 镜像

BG 前几日 Sean 老师发布了一篇文章 – PostgreSQL安装(一): 再简单点儿,用Docker?, 介绍如何快速安装启动 PostgreSQL 数据库。 本文再稍微延伸一点,介绍一下如何自定义 Dockerfile,加入自己想要预制的参数,构建一个自定义的 …

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法: 前言 为了使用unreal engine5.3.2创建c第一人称游戏,今天安装了Visual Studio 2022专业版。在ue5中创建c工程,结果编译器报错: 严重性 代码 说明 项目…

如何构建用于从收据中提取信息的生成式人工智能工具

原文地址:how-to-build-a-generative-ai-tool-for-information-extraction-from-receipts 使用 LangChain 和 OpenAI 工具从 Google Drive 中存储的收据图像中提取结构化信息 2024 年 4 月 10 日 纸质收据有各种样式和格式,是自动信息提取的一个有趣目…

【大模型应用】使用 Windows 窗体作为 Copilot 应用程序的 Ollama AI 前端(测试llava视觉问答)...

项目 “WinForm_Ollama_Copilot” 是一个使用Windows Forms作为前端的Ollama AI Copilot应用程序。这个项目的目的是提供一个用户界面(UI),通过它,用户可以与Ollama AI进行交互。以下是该项目的一些关键特点和功能: Ollama Copilot: 这是一个…

SSM+Vue在线OA办公系统

在线办公分三个用户登录,管理员,经理,员工。 SSM架构,maven管理工具,数据库Mysql,系统有文档,可有偿安装调试及讲解,项目保证质量。需要划到 最底 下可以联系到我。 功能如下&am…

免安装SQL管理工具HeidiSQL建库如何选Collation字符校对

免安装SQL管理工具HeidiSQL 文章目录 免安装SQL管理工具HeidiSQL一、安装二、建库因此,通常我们选择: 一、安装 到官方网址:https://www.heidisql.com/ 下载后按不同版本安装或解压,运行目录中的heidisql应用程序。 该工具可以对…

万界星空科技商业开源MES+项目合作+商业开源低代码平台

今天我想和大家分享的是一套商业开源的 MES制造执行管理系统带源码。对于制造业而言,MES 是一个至关重要的系统,它可以帮助企业提高生产效率、优化资源利用、提高产品质量,从而增强市场竞争力。 什么是 MES? MES 是指通过计算机技…

Luminar开始为沃尔沃生产下一代激光雷达传感器

在自动驾驶技术的浪潮中,激光雷达(LiDAR)传感器以其高精度和强大的环境感知能力,逐渐成为了该领域的技术之星。Luminar(路安达)公司作为自动驾驶技术的领军企业,近日宣布已开始为沃尔沃汽车生产…

Git使用指北

目录 创建一个Git仓库本地仓库添加文件文件提交到本地仓库缓冲区添加远程仓库地址本地仓库推送到远程仓库创建新的分支拉取代码同步删除缓冲区的文件,远程仓库的文件.gitignore文件 创建一个Git仓库 Git仓库分为远程和本地两种,远程仓库如Githu上创建的…

Themis新篇章:老牌衍生品协议登陆Blast L2,探索全新经济模型

本文将深入分析 Themis 的最新经济模型,探讨其核心概念和机制、优势与创新之处、风险与挑战。 一、引言 随着区块链技术的不断发展,DeFi 衍生品项目逐渐成为市场的焦点。而用户体验的革新,进一步的金融创新,去中心化治理方案的优…

Golang | Leetcode Golang题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; func uniquePathsWithObstacles(obstacleGrid [][]int) int {n, m : len(obstacleGrid), len(obstacleGrid[0])f : make([]int, m)if obstacleGrid[0][0] 0 {f[0] 1}for i : 0; i < n; i {for j : 0; j < m; j {if obstacleGrid[i]…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

go-mysql-transfer 同步数据到es

同步数据需要注意的事项 前提条件 1 要同步的mysql 表必须包含主键 2 mysql binlog 必须是row 模式 3 不支持程序运行过程中修改表结构 4 要赋予连接mysql 账号的权限 reload, replication super 权限 如果是root 权限则不需要 安装 go-mysql-transfer ​ git clone…

和丰多媒体信息发布系统 QH.aspx 文件上传漏洞复现

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

【Docker】如何注册Hub账号并上传镜像到Hub仓库

一、创建Hub账户 浏览器访问&#xff1a;hub.docker.com 点击【Sign up】注册账号 输入【邮箱】【用户名】【密码】 ps&#xff1a;用户名要有字母数字&#xff1b;订阅不用勾选 点击【Sign up】注册即可 点击【Sign in】登录账号 输入【邮箱】【密码】 点击【Continue】登录 二…

大数据之数据仓库技术:ETL工具和Kettle简介

大数据之数据仓库技术&#xff1a;ETL工具和Kettle简介 ETL简介ETL工具和KettleKettle家族 Kettle资源KettlePack 任务调度工具 ETL简介 ETL(Extract-Transform-Load): 在大数据技术领域内&#xff0c;用来描述将数据从 来源端 经过 抽取(extract), 转换(transform), 加载(loa…

cefsharp实现资源替换如网页背景、移除替换标签、html标识、执行javascript脚本学习笔记(含源码说明)

(一)实现测试(仅供学习参考) 1.1 目标系统页面(登录页)和登录后首页面中2处(一个替换一个移除) 1.2 实现后效果(使用cefsharp自定义浏览器实现以上功能) 1.3 登录后页面替换和移除 系统名称和一个功能菜单li (二)通过分析代码实现脚本编写 2.1 分开处理,设置了…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好&#xff01;今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说&#xff0c;让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题&#xff1a;https://leetcode.cn/problems/reverse-linked-list 1.2解…

Linux 第十八章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…