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

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例,展示了进度管理中的复杂性和潜在的冲突: 案例一:近期,一个长期合作的客户因政策要求,急需我们为多家医院升级一个小功能。在这个过程中出现了三个主要问题: 在双方确认接口协议后,客户私自修改接口并未通知我们,直到催进度时才发现这个问题关于UI设计的部分,后台开发人员未将其传递给