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实现分布式会话的更多相关文章

  1. 补习系列(15)-springboot 分布式会话原理

    目录 一.背景 二.SpringBoot 分布式会话 三.样例程序 四.原理进阶 A. 序列化 B. 会话代理 C. 数据老化 小结 一.背景 在 补习系列(3)-springboot 几种scope ...

  2. 004-restful应用构建、分布式会话、测试工具简介

    一.概述 什么是rest(表述性状态转移,Representational State Transfer)是一种架构风格.他定义了创建可扩展Web服务的最佳实践. 1.Richardson成熟度模型 ...

  3. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  4. Shiro权限管理框架(二):Shiro结合Redis实现分布式环境下的Session共享

    首发地址:https://www.guitu18.com/post/2019/07/28/44.html 本篇是Shiro系列第二篇,使用Shiro基于Redis实现分布式环境下的Session共享. ...

  5. 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》

    二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro  目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...

  6. 【Redis】分布式Session

    一.问题引出 1.1 Session的原理 1.2 问题概述 二.解决方案 三.代码实现-使用Token代替Session 3.1 Service 3.2 TokenController 一.问题引出 ...

  7. Redis实现分布式缓存

    Redis 分布式缓存实现(一) 1. 什么是缓存(Cache) 定义:就是计算机内存中的一段数据: 2. 内存中数据特点 a. 读写快    b. 断电立即丢失 3. 缓存解决了什么问题? a. 提 ...

  8. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

随机推荐

  1. 可怕!字节跳动大牛爆出的“Android进阶指南”,强到无法形容,GitHub已标星“8.5k”!

    前言 从去年8月份开始,我开始重新找工作,在这期间刷了不少面试题和大牛博客,无意中薅到一份字节跳动大牛整理的一份"Android进阶指南",包含Android面试常见问题.主流技术 ...

  2. 【LeetCode】155. 最小栈

    155. 最小栈 知识点:栈:单调 题目描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删 ...

  3. jdbc如何注册数据库驱动Driver的?

    1. 先看看原生jdbc执行sql的步骤 // 在程序启动的时候需要注册一次mysql驱动,必须引入 mysql-connnector-java 的包 Class.forName("com. ...

  4. Python日志记录

    官方文档:https://docs.python.org/2/library/logging.html logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为, ...

  5. sqli-labs lesson 24-25a

    less 24: 注意一开始登录后出现无法返回或者跳转页面的话是因为一开始解压sqli-labs文件时出现 logged-in.php文件不正确同名文件有问题. 直接重新解压一边全部替换掉所有文件即可 ...

  6. 题解 CF613E Puzzle Lover

    解题思路 其实仔细观察我们可以发现路径一定是一个类似于下图的一个左括号之后中间随便反复曲折,然后右边在来一个右括号. 然后对于两个括号形状的东西其实是可以利用 Hash 来判等特殊处理的. 对于中间的 ...

  7. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  8. L298N的接线和详细使用方法

    文章说明: 名词概念(为了方便易懂,我就通俗的表达): 逻辑电压:控制板子执行程序的电压. 驱动电压:输出口AB的电压. 逻辑电流:驱动板执行程序的电流. 驱动电流:输出口AB的电流. 本人调试此款L ...

  9. C# 如何在编译时将 dll 复制到 bin\Release 目录下

    下面假设 Project 名为 Gamma4RTD,需要调用的 dll 文件为 rtddll.dll.IDE 是 Visual Studio 2015 打开 Visual Studio 2015 -& ...

  10. Quartz任务调度(3)存储与持久化操作配置详细解

    内存存储RAMJobStore Quartz默认使用RAMJobStore,它的优点是速度.因为所有的 Scheduler 信息都保存在计算机内存中,访问这些数据随着电脑而变快.而无须访问数据库或IO ...