当前位置: 首页 > news >正文

记一次分布式环境下TOKEN实现用户登录

背景:

​ 以前的单体项目,使用的是session来保存用户登录状态,控制用户的登录过期时间等信息,但是这个session是只保存在该服务器的这个系统内存中。系统只有一个服务就没关系,但是如果是分布式的服务,每个服务都有一个自己的session,传统的做法就无法判断用户的登录状态了,也有解决办法,就是服务之间的session复制,但是代价太大了,开发成本高、难以维护。所以分布式服务下我们一般使用当下比较流向的redis+token实现用户登录。

解决方案:

​ 解决方案分两种情况,第一种:单点登录(一个用户一个token),第二种:多客户端登录(一个用户多个token)

单点登录:

​ 单点登录,会更加安全,用户同时只能在一个客户端登录。token生成,这个就不说了,网上代码一大堆,保持随机性和唯一性就可以。整个单点登录的具体实现思路如下:

  1. 当用户登录时,且账号密码正确
    1. 后端根据用户ID删除redis中1.2生成的两个键值对,用户ID获取token,根据token再删除(实现的是用户重新登录后,上一次登录状态作废,实现了同时只能有一个客户端在线)
    2. 后端生成一个token,往redis存两个带过期时间(一般是2小时)的键值对,分别为 key:token,value:用户信息、key:用户ID,value:token。第一个键值对用来判断用户登录状态是否过期,第二个键值对便于获取用户信息。
    3. 后端最后将token返回到响应头中
  2. 前端解析返回的响应头,获取token,将token存储在cookie中(默认20分钟过期)
  3. 前端在登录后的发送的请求,都需要在请求头中赋值token(前端请求拦截器实现)
  4. 后端设置网关拦截器
    1. 拦截除白名单(自己配置,因为有的请求不需要校验token,比如登录)外的请求
    2. 判断请求是否有token且该token能否在redis中找到,如果有token则放行该请求,且设置响应头赋值token。token不存在则返回登录过期(此处于前端约定登录过期的状态)
    3. 判断请求中的token存在,且距离redis设置的过期时间不到五分钟(此处灵活设置),重新生成token(一定时间更换token,提高安全性),执行1.2操作,将redis中老的token设置过期时间为30秒(解决并发请求,其他请求还在拦截器处理中)
    4. 4.3操作加redis分布式锁,锁的粒度为用户级,防止同一用户多次刷新token
  5. 前端设置响应拦截器,当后端返回登录过期时,跳转到登录页,提示登录过期。当后端返回正常时,获取响应头的token,刷新cookie里的token

多客户端登录

​ 多客户端,用户可同时在多个客户端登录。token生成,这个就不说了,网上代码一大堆,保持随机性和唯一性就可以。整个多客户端登录的具体实现思路如下:

  1. 当用户登录时,且账号密码正确
    1. 后端正常生成新的token,存入redis(实现的是用户重新登录后,上一次登录状态依旧存在,实现了同时有多个客户端在线)
    2. 后端生成一个token,往redis存两个带过期时间(一般是2小时)的键值对,分别为 key:token,value:用户信息、key:用户ID+token,value:token。第一个键值对用来判断用户登录状态是否过期,第二个键值对便于获取用户信息。
    3. 后端最后将token返回到响应头中
  2. 前端解析返回的响应头,获取token,将token存储在cookie中(默认20分钟过期)
  3. 前端在登录后的发送的请求,都需要在请求头中赋值token(前端请求拦截器实现)
  4. 后端设置网关拦截器
    1. 拦截除白名单(自己配置,因为有的请求不需要校验token,比如登录)外的请求
    2. 判断请求是否有token且该token能否在redis中找到,如果有token则放行该请求,且设置响应头赋值token。token不存在则返回登录过期(此处于前端约定登录过期的状态)
    3. 判断请求中的token存在,且距离redis设置的过期时间不到五分钟(此处灵活设置),重新生成token(一定时间更换token,提高安全性),执行1.2操作,将redis中老的token设置过期时间为30秒(解决并发请求,其他请求还在拦截器处理中)
    4. 4.3操作加redis分布式锁,锁的粒度为用户+token级,防止同一客户端用户多次刷新token
  5. 前端设置响应拦截器,当后端返回登录过期时,跳转到登录页,提示登录过期。当后端返回正常时,获取响应头的token,刷新cookie里的token

相关文章:

记一次分布式环境下TOKEN实现用户登录

背景: ​ 以前的单体项目,使用的是session来保存用户登录状态,控制用户的登录过期时间等信息,但是这个session是只保存在该服务器的这个系统内存中。系统只有一个服务就没关系,但是如果是分布式的服务,每个…...

用cpolar发布本地的论坛网站 1

网页论坛向来是个很神奇的地方,曾经的天涯论坛和各种BBS,大家聚在在一起讨论某个问题,也能通过论坛发布想法,各种思维碰撞在一起,发生很多有趣的故事,也产生了很多流传一时的流行语录。当然,如果…...

CSS的4种引入方式

CSS的4种引入方式 目录CSS的4种引入方式一、内嵌式:CSS写在style标签中二、外联式:CSS写在一个单独的.css文件中三、行内式:CSS写在标签的style属性中四、导入外部样式五、css引用的优先级六、link和import的区别一、内嵌式:CSS写…...

Shell高级——Linux中的文件描述符(本质是数组的下标)

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 前言 Linux中一切接文件,比如 C 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上…...

Nvidia jetson nano硬件架构

资料来源 官方文档中心 https://developer.nvidia.com/embedded/downloads -> 选jetson -> Jetson Nano Product Design Guide //产品设计指导(入口) //-> 1.1 References 列出了相关的文档 -> Jetson Nano Developer Kit Carrier Board Specification //板子标注…...

ffmpeg多路同时推流

一、ffmpeg常见使用方法1.1利用FFMPEG命令进行文件分割1.2转换格式1.3推流配置方法一:ngnix(不推荐,推流不好使)方法二:srs(强烈推荐)1.4查看nginx启动是否成功二、ffmpeg推流——>ngnix单路…...

一次性搞定 `SHOW SLAVE STATUS` 的解读

一次性搞定 SHOW SLAVE STATUS 的解读 解析日志文件的位置 诚然, GTID(全局事务标识符)已经在 MySQL 5.6中得到支持, 此外,还可以通过 Tungsten replicator 软件来实现(2009年以后一直有谷歌在维护,不是吗?)。 但有一部分人还在使用MySQL 5.5的标准副本方式, 那么这些二进制日…...

【代码随想录训练营】【Day25】第七章|回溯算法 |216.组合总和III|17.电话号码的字母组合

组合总和III 题目详细:LeetCode.216 做过上一题组合后,再来写这道题就显得得心应手了,通过理解回溯算法的模版,也总结出了算法中的一些特点: 回溯算法与递归算法类似,同样需要参数、结束条件和主体逻辑回…...

docker使用

https://blog.csdn.net/u012563853/article/details/125295985http://www.ppmy.cn/news/11249.html启动 docker服务并设置开机自动启动dockersudo systemctl start docker sudo systemctl enable dockerdocker 常见启动失败问题:https://blog.csdn.net/zhulianseu/article/deta…...

手把手docker registry配置登录名/密码

我们的Docker私有仓库Registry服务只有加了认证机制之后我们的Registry服务才会更加的安全可靠。赶快跟随以下步骤来增加认证机制吧。 创建docker registry工作目录 mkdir -p /data/docker.registry 创建将保存凭据的文件夹 mkdir -p /data/docker.registry/etc/registry/auth…...

一步打通多渠道服务场景 中电金信源启移动开发平台MADP功能“上新”

日前,中电金信源启移动开发平台MADP功能迭代升级,“上新”源启小程序开发平台。定位“为金融业定制”的移动PaaS平台,源启小程序开发平台为银行、互联网金融、保险、证券客户提供一站式小程序的开发、运营、营销全生命周期管理技术支撑&#…...

Kubernetes06:Controller (Deployment无状态应用)

Kubernetes06:Controller 1、什么是controller 管理和运行容器的对象,是一个物理概念 在集群上管理和运行容器的对象 2、Pod和Controller之间的关系 Pod是通过controller来实现应用的运维 比如伸缩、滚动升级等等操作Pod和Controller之间通过 label 标签建立关系…...

低代码开发平台选型必看指南

低代码开发是近年来逐渐兴起的一种新型软件开发方式。它通过封装常见的软件开发流程和代码,使得非专业的开发者也能够轻松创建复杂的应用程序。这种开发方式已经受到了许多企业的青睐,成为提高生产效率、降低开发成本的一种有效途径。 低代码开发的核心…...

OVN:ovn20.03.1/ovs2.13.0编译rpm过程

操作系统openeuler22.0,x86架构分别下载ovn和ovs的源码https://github.com/openvswitch/ovs/tree/v2.13.0https://github.com/ovn-org/ovn/tree/v20.03.1安装必要工具:yum install -y unzip tar make autoconf automake libtool rpm-build gcc libuuid-d…...

Shell管道

一、管道是什么 英文是pipe。 把一个命令的标准输出作为下一个命令的标准输入,以这种方式连接的两个或者多个命令就形成了管道 使用竖线|连接多个命令,称为管道符。 语法格式如下: command1 | command2 [ | commandN... ] command1的标准…...

Zynq UltraScale系列使用MIPI CSI-2 RX Subsystem 解码MIPI视频PD输出 提供2套工程源码和技术支持

目录1、前言2、设计思路和架构3、vivado工程详解4、上板调试验证5、福利:工程代码的获取1、前言 本设计采用OV5640摄像头MIPI模式作为输入,分辨率为1280x72060Hz,MIPI解码方案采用Xilinx官方提供的MIPI CSI-2 RX Subsystem IP解码MIPI视频&a…...

C++:详解C++11 线程休眠函数

休眠函数简介1: 让线程休眠一段时间1.1:std::chrono 的时钟 clock简介 C11 之前并未提供专门的休眠函数,C语言的 sleep、usleep函数其实是系统提供的函数,不同的系统函数的功能还要些差异。 在Windows系统中,sleep的参数是毫秒 …...

TryHackMe-The Great Escape(Docker)

The Great Escape 我们的开发人员创建了一个很棒的新网站。你能冲出沙盒吗? 端口扫描 循例 nmap Web信息收集 robots.txt: /exif-util是文件上传点,但是绕过之后貌似没啥用 在robots.txt当中披露了可能存在.bak.txt,现在我们已知的文件就是…...

这么强才给我28k,我头都不回,转身拿下40k~

时间真的过得很快,眨眼就从校园刚出来的帅气小伙变成了油腻大叔,给各位刚入道的测试朋友一点小建议,希望你们直通罗马吧! 如何选择自己合适的方向 关于选择测试管理: 第一,你一定不会是一个喜欢技术&…...

【Python学习笔记】第二十一节 Python Lambda 函数

Python 提供了非常多的库和内置函数。有不同的方法可以执行相同的任务,而在 Python 中,有个万能之王函数:lambda 函数,它以不同的方式在任何地方使用。一、Lambda 函数简介在 Python 中,函数可以接受一个或多个位置参数…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...