使用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来配 ...
随机推荐
- C++//递增运算符重载
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 //重载递增运算符 6 7 //自定义 ...
- 37岁Android程序员裸辞,四个月被497家公司拒绝,问猎头后懵了
一位网友在职场论坛上发了一个帖子,他说自己今年三十七岁了,是一名Android老兵,因为和上家公司的领导闹矛盾有了嫌隙,一气之下就裸辞了,如今已经辞职四个月了,也失业了四个月. 每天都在努力投简历,共 ...
- Docker入门第一章
Docker为什么出现? 一款产品:开发到上线 两套环境!应用环境,应用配置! 可能在开发环境你的产品是正常的,但是到了线上环境你的产品可能就会出现各种原因,或许是因为环境的不同,也可能是因为配置的不 ...
- 案例分享:Qt政务标签设计器,标签排版软件定制与打印
需求 1.标签设计器: 2.具备文字排版功能: 3.支持六种排版格式: 4.排版后可以输出打印(demo中不包含): 5.排版后可以输出标签的指定协议文本FBD格式: 6.可以调整对应标 ...
- 《MySQL实战45讲》(8-15)笔记
MySQL实战45讲 目录 MySQL实战45讲 第八节: 事务到底是隔离的还是不隔离的? 在MySQL里,有两个"视图"的概念: "快照"在MVCC里是怎么工 ...
- shell检查文件内容是否变化
# 先记录文件的md5 md5sum ip.list >ip.md5 # 记录新的md5与之前的比较 #!/bin/bash md5sum ip.list > .ip.md5 diff i ...
- 【spring 注解驱动开发】spring组件注册
尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...
- WPF---数据绑定之RelativeSource(五)
一.概述 当Binding有明确的数据来源的时候,我们可以用Source或者ElementName赋值的办法让Binding与之关联. 但是,有时候当我们不能确定作为Source的对象叫什么名字的时候 ...
- NIO中的File
package nio; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files ...
- go语言初始化结构体指针
go语言初始化结构体指针 head:=&ListNode{} 或者 head:=new(ListNode)