使用Redis实现分布式会话
1. 概述
传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的。
但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的session,用户的每次请求都可能到达不同的Tomcat,因此可能会出现需要登录多次或者登录无效的情况出现。
为了解决这个问题,就需要使用一个缓存中间件,将登录用户的信息存入这个缓存中间件,所有的Tomcat都从缓存中间件中获取登录用户信息,从而判断登录状态。
Redis就是一个很好用的缓存中间件,接下来我们就来聊聊分布式应用该如何实现用户登录的逻辑。
2. 单体应用的用户登录
传统的单体应用,通常只有一个Tomcat。
用户提交登录信息时,后台会根据用户登录名,得到用户信息,然后比对密码,如果正确,则将用户信息放入Tomcat的session中。
用户请求需要登录的接口时,先从Tomcat的session中得到用户信息,如果用户信息是null,则接口无法访问,提示用户登录。如果用户信息不为null,则使用用户信息完成接口逻辑。
3.分布式应用的用户登录
3.1 方案一:允许用户异地登录
用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。
以这个随机数为key,用户信息为value,存入redis。
在cookie中存入一个固定值的key,例如:mySessionId,value为这个随机数。
用户请求需要登录的接口时,先从cookie中拿到随机数,然后以随机数为key,从redis中得到用户信息,如果用户信息不为null,则表示用户已登录。
用户注销登录时,将cookie中的随机数和redis中的用户信息都清空。
3.2 方案二:不允许用户异地登录(以新登录的为准)
用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。
将这个随机数放入用户信息中,在cookie中存入一个固定值的key,例如:curUser,value是脱敏后的用户信息。
以用户ID为key,这个随机数为value,存入redis。
用户请求需要登录的接口时,先从cookie中拿到用户信息,然后以用户信息中的用户ID为key,从redis中得到随机数。
如果redis中随机数不存在,则表示没有登录,如果存在,使用redis中得到的随机数与cookie中用户信息中的随机数做对比,如果不一致,则表示用户在其他地方登录,需要重新登录。
用户注销登录时,将cookie中的用户信息和redis中的随机数都清空。
4.综述
今天简单聊了一下使用redis实现分布式会话,希望能对大家的工作有所帮助。
欢迎大家多多评论交流,共同成长。
关注追风人聊Java,每天更新Java干货。
使用Redis实现分布式会话的更多相关文章
- 补习系列(15)-springboot 分布式会话原理
目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope ...
- 004-restful应用构建、分布式会话、测试工具简介
一.概述 什么是rest(表述性状态转移,Representational State Transfer)是一种架构风格.他定义了创建可扩展Web服务的最佳实践. 1.Richardson成熟度模型 ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享
首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...
- 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》
二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro 目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...
- 【Redis】分布式Session
一.问题引出 1.1 Session的原理 1.2 问题概述 二.解决方案 三.代码实现-使用Token代替Session 3.1 Service 3.2 TokenController 一.问题引出 ...
- Redis实现分布式缓存
Redis 分布式缓存实现(一) 1. 什么是缓存(Cache) 定义:就是计算机内存中的一段数据: 2. 内存中数据特点 a. 读写快 b. 断电立即丢失 3. 缓存解决了什么问题? a. 提 ...
- Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等
NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
随机推荐
- GooseFS助力大数据业务数倍提升计算能力
前言 GooseFS是由腾讯云推出的一款分布式缓存方案,主要针对包括需要缓存加速的数据湖业务场景,提供基于对象存储COS服务的近计算端数据加速层. GooseFS 基于开源大数据缓存方案 Alluxi ...
- 攻防世界Web区部分题解
攻防世界Web区部分题解 前言:PHP序列化就是把代码中所有的 对象 , 类 , 数组 , 变量 , 匿名函数等全部转换为一个字符串 , 提供给用户传输和存储 . 而反序列化就是把字符串重新转换为 ...
- 小白学习vue第三天,从入门到精通(computed计算属性)
computed计算属性 <body> <div id="app"> <div>{{myName}}</div> </div& ...
- bugku-web3
这道题涉及的是HTML解码的问题,很简单,注意 HTML编码的格式 进入题目给出的网址,我们一直点击会一直循环跳动 勾选上阻止此页面创建更多对话框一栏,进去之后是空白的页面,查看源码. 这是一段HTM ...
- 三年Android开发快手、美团、支付宝连挂,怒刷1549页面试题字节上岸
刚开始面试的时候我真的是处处碰壁,面一家挂一家,面完之后怀疑自我,是不是自己真的太菜了找不到工作.工作本身就是双向选择,一家不行再换一家,总有合适的,千万不要因为别人的一句话就全盘否定自己,一定要自信 ...
- Python包安装过程
以下是paramiko-1.7.7.1的安装过程,可以看到整个过程分为步,第一步是build,就是拷贝源文件到build文件夹里, F:\VMFiles\tmpFiles\paramiko-1.7.7 ...
- JavaScript学习07(jQuery)
jQuery 什么是JQuery jQuery 由 John Resig 于 2006 年创建.它旨在处理浏览器不兼容性并简化 HTML DOM 操作.事件处理.动画和 Ajax. 十多年来,jQue ...
- docker-02
环境准备 10.0.0.100这台宿主机先做好给docker容器本地yum源,其实也可以用阿里等其他的yum源 1 上传6.9和7.6的镜像到10.0.0.100这台服务器 [root@docker ...
- JavaScript之BOM和DOM及其兼容操作详细总结
BOM(浏览器对象模型) 所有浏览器都支持window对象,他表示浏览器窗口. 所有js全局对象,函数,变量均自动成为window对象的成员. 全局变量是window对象的属性. 全局函数是windo ...
- Centos7 出现Welcome to emergency mode!【紧急模式】
Centos7 出现Welcome to emergency mode![紧急模式] 做mount挂载时,修改了 /etc/fstab 文件,导致Centos7重启时出现如下图所示错误: 输入r ...