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);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199341.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国停车位收费标准接口API

1) 请求地址 接口地址https://psbg.jparking.cn/cw-gateway/cwzg/v1/near_park 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 数据来源捷停车 不可用于商用 概不负责 4) 请求参数: {"latitude": "29.563009", //坐标"longitude&quo…

Verilog基础:编译指令`timescale

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 timescale编译指令用于指定指令后模块的时间单位和时间精度。时间单位是时间值的度量单位&#xff0c;例如延迟值和仿真时间&#xff1b;而仿真精度决定了最小可分…

集成测试如何做?

今天学习下如何进行集成测试。 什么是集成测试? 集成测试被定义为一种测试类型&#xff0c;其中软件模块在逻辑上集成并作为一个组进行测试。一个典型的软件项目由多个软件模块组成&#xff0c;由不同的程序员编码。此级别测试的目的是在集成这些软件模块时&#xff0c;暴露…

全网最新最全的Appium自动化:Appium常用操作之H5页面操作 --待补充!

手机chrome浏览器操作&#xff1a; 手机端chrome浏览器一般用于打开H5手机版网站&#xff0c;它的操作方式与PC端的浏览器操作&#xff08;即selenium对浏览器的操作&#xff09;是一模一样的&#xff0c;由于切换后的WebView页面也属于网页 下述的方法中部分支持在webview页面…

什么是JVM的内存模型?详细阐述Java中局部变量、常量、类名等信息在JVM中的存储位置

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客 目录 一、JVM基本介绍 二、JVM内存模型 2.0 概述 2.1 类加载子系统 2.2 运行时数据区 2.2.0 基本…

python中的输入输出

文章目录 输入函数input()例子1.如何输入获得两个字符串?&#xff08;若输入abc def或abc,def)2.如何输入获得两个整数?&#xff08;若输入34,567)3.如何输入后获得一个元素均为数值型的列表?&#xff08;若输入12,3.4,567或[12,3.4,567]&#xff09; 输出输出函数print()pr…

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板&#xff0c;以及一个通用的向量类模板和一个字符串类作为其派生类&#xff0c;以满足各种应用场景中的数据存储和处理需求。 项目内容&#xff1a; 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…

如何计算光伏电站的发电量?

光伏电站的发电量是衡量其性能和经济效益的关键指标。准确地预测和计算光伏电站的发电量对于投资决策、系统设计和优化至关重要。以下是一些计算光伏电站发电量的主要步骤和方法&#xff1a; 1、确定光伏电站的规模和配置 了解光伏电站的组件数量、类型、功率等级以及安装位置…

html和css写QQ会员页面导航

目录 1、css代码 2、html代码 效果图 1、css代码 <style>* {padding: 0;margin: 0;list-style: none;text-decoration: none;}div {margin: 30px auto;}li {float: left;height: 60px;background-color: rgb(102, 102, 102);line-height: 40px;}img {height: 100%;ma…

Vellum —— 相关特点

目录 Cloth Breaking and tearing Paneling and draping Cloth simulation Calculating mass and thickness Working with low res and high res cloth Quick moving cloth Softbody Vellum softbodies Plasticity with softbodies Constraints Stitch and slid…

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…

【银行测试】第三方支付功能测试点+贷款常问面试题(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、第三方支付功能…

华为快应用中自定义Slider效果

文章目录 一、前言二、实现代码三、参考链接 一、前言 在华为快应用中官方提供了<slider>控件&#xff0c;但是这个控件的限制比较多&#xff0c;比如滑块无法自定义&#xff0c;所以这里进行下自定义&#xff0c;自己修改样式。 二、实现代码 整体效果如下: 源码如下…

SL6015B降压恒流60V耐压1.5A高辉调光LED芯片 电路简单 元器件少

SL6015B是一款专为LED照明应用设计的降压恒流芯片&#xff0c;具有60V的耐压能力&#xff0c;最大输出电流可达1.5A。它采用高辉调光方式&#xff0c;通过改变输入电压或电流来调节LED的亮度。此外&#xff0c;SL6015B还具有电路简单和元器件数量少的特点&#xff0c;使其成为一…

QT-在ui界面中给QWidget增加Layout布局的两种方法

QT-在ui界面中给QWidget增加Layout布局的两种方法 方式一 在UI界面&#xff0c;用拖拽的方式加入Layout方式二 用notepad软件打开.ui文件&#xff0c;手动加入Layout代码 目标&#xff1a;去除右下角红标&#xff0c;给tab标签增加Layout属性。 方式一 在UI界面&#xff0c;用…

leetcode:前序遍历

题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目分析 这道题的难点在于&#xff0c;前序遍历一遍之后需要将数值存在数组里&#xff0c;returnsize就是数组的大小 所以我们先构建一个函数来计算节点的个数 然后我…

中国AI大模型,应该如何商业化?

虽然大模型商业化的路径较为清晰&#xff0c;目前国内厂商也都在积极探索&#xff0c;但大模型的商业化之路&#xff0c;不能仅限于商业模式的探索尝试&#xff0c;更在于解决大模型发展的底层问题。 作者|斗斗 编辑|皮爷 出品|产业家 如今&#xff0c;大模型的商业化问题再…

深度观察|近视防控乱象下,角膜塑形镜撬动百亿市场的背后…

前不久&#xff0c;“晒眼皮”莫名上了热搜。顾名思义&#xff0c;就是在太阳底下闭眼&#xff0c;让眼皮享受日光浴。 不少近视患者相信&#xff0c;这种做法可以延缓近视&#xff0c;甚至可以让近视度数“清零”。毫无疑问&#xff0c;这是一个收割智商税的做法&#xff0c;…

敏捷开发迭代缺陷统计的重要性

在敏捷开发中&#xff0c;迭代缺陷统计具有重要性&#xff0c;对团队和项目具有多方面的影响&#xff1a; 早期发现和解决问题&#xff1a; 迭代缺陷统计允许团队及时识别和定位在迭代中出现的问题。这有助于早期解决问题&#xff0c;避免问题扩大化&#xff0c;并最大程度地减…

Oracle连接错误:ORA-28040:没有匹配的验证协议

一、产生原因&#xff1a;oci动态库版本太低&#xff0c;无法连接高版本的数据库 二、解决办法 1、下载高版本的oci库 https://www.oracle.com/database/technologies/instant-client/winx64-64- downloads.html 2、解压并复制oci动态库 3、粘贴到相应的目录