CookieSession Redis 到JWT会话管理历史

2023-12-02 20:12

本文主要是介绍CookieSession Redis 到JWT会话管理历史,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单应用时期,通常使用 Cookies 和 Session 进行会话管理。

用户登录后,服务器创建一个唯一的会话标识符(Session ID),将其存储在浏览器的 Cookies

中,并在服务端维护一个关联该标识符的会话对象。

这种方式的问题在于,会话状态存储在服务器本地内存中,如果有多个应用实例,会导致会话状态

无法共享。

为了解决单应用的局限性,引入 Redis 作为分布式缓存存储会话数据。 

Redis 具有高性能、可伸缩性,而且可以集中管理分布式环境下的会话数据

简单点讲,就是多个应用连接同一个Redis实现会话共享

像SpringSession其实用的也是这套

其实原先的Token也是仿造了Session的机制,原理就是后端返回一个Token,然后每次请求是都将Token带到服务器,用Token作为Key来找对应的Value

JWT 是一种基于 Token 的认证机制,通过在客户端存储 Token,而不需要在服务器端保留会话状态。

可以说JWT是专门进行分布式会话管理的

在分布式系统中,不同服务之间可能需要共享用户会话信息。JWT 的结构允许信息被安全地编码为一个 Token,并在服务之间传递,而无需依赖共享的存储机制。

使用JWT

依赖

<!--JWT的三个依赖-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope>
</dependency>

 //创建JWT@Testpublic void testCreatedJwt() {
//        String s= UUID.randomUUID().toString().replace("-", "");
//        System.out.println("s="+s);//9f4224f2fb0d44cbbe5d03abd14a3badString key = "9f4224f2fb0d44cbbe5d03abd14a3bad";//每个应用都需要用来解密的一个key 我这里用UUID生成//创建SeceretKeySecretKey secretKey = Keys.hmacShaKeyFor(key.getBytes(StandardCharsets.UTF_8));Map<String, Object> data = new HashMap<>();data.put("uid", 1001);data.put("name", "小王王");data.put("role", "经理");//DateUtils.addMinutes(new Date(), 10);用commons-lang3的工具类  指定时间上加多少分钟也可以//创建JWT 使用Jwts类String jwtToken = Jwts.builder().signWith(secretKey, SignatureAlgorithm.HS256) 设置签名密钥和使用的算法.setExpiration(new Date(new Date().getTime() + 60 * 10 * 1000))//设置过期时间10分钟之后.setIssuedAt(new Date())//设置令牌签发时间,即当前时间.setId(UUID.randomUUID().toString())// 设置JWT的唯一标识符(JTI).addClaims(data)// 添加额外的声明(payload 中的数据).compact();// 构建并压缩JWT成为一个字符串//eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDE0NjUyOTUsImlhdCI6MTcwMTQ2NDY5NSwianRpIjoiZDVmY2FlZmItYzJkMi00YzMxLWFhYzktYjcwNjZiYTUyNzViIiwicm9sZSI6Iue7j-eQhiIsIm5hbWUiOiLlsI_njovnjosiLCJpZCI6MTAwMX0.VLcmm-8dOjKVeobSwysXPZHvDkul-n3wLKAzSM7P4lwSystem.out.println(jwtToken);}//读JWT@Testpublic void readJwtTest() {String jwtToken = "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3MDE0NzQwNjYsImlhdCI6MTcwMTQ3MzQ2NiwianRpIjoiMWU4OWM4YzktNGI2Yy00NmVmLWI1YWMtZDkyODEyODUxYTZmIiwidWlkIjoxMDAxLCJyb2xlIjoi57uP55CGIiwibmFtZSI6IuWwj-eOi-eOiyJ9.W1IfvHWHc-vbwM8tSwXUUFjFgZrr47qy8aC9rCedvUw";String key = "9f4224f2fb0d44cbbe5d03abd14a3bad";//每个应用都需要用来解密的一个key//创建SeceretKeySecretKey secretKey = Keys.hmacShaKeyFor(key.getBytes(StandardCharsets.UTF_8));//解析JWT 没有异常 继续读   有异常说明这个jwtToken是无效的  ExpiredJwtException过期异常Jws<Claims> claimsJws = Jwts.parserBuilder()//创建一个JWT解析器的构建器对象,该对象用于配置JWT解析器的各种参数。.setSigningKey(secretKey)//设置JWT解析器使用的签名密钥,以便验证JWT的真实性.build().parseClaimsJws(jwtToken);//使用构建好的JWT解析器解析JWT令牌。这个方法返回一个Jws<Claims>对象,其中包含了JWT的各种声明(claims),以及相关的信息,如签名等。//读数据Claims body = claimsJws.getBody();//通过body可以获取所有原先放进去的值  举例Integer id = body.get("uid", Integer.class);System.out.println("uid=" + id);Object uid = body.get("uid");System.out.println("uid=" + uid);String name = (String) body.get("name");System.out.println("name=" + name);//JWT的唯一标识符String id3 = body.getId();System.out.println("唯一表示符:" + id3);//获取设置的过期时间Date expiration = body.getExpiration();System.out.println("过期时间:" + expiration);}

这篇关于CookieSession Redis 到JWT会话管理历史的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/446647

相关文章

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess