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,一经查实,立即删除!

相关文章

基因名潘多拉

同一基因可能会有多种命名&#xff0c;如Ensembl gene ID、NCBI Entrez gene ID、Gene Symbol等 基因有哪些名儿&#xff0c;你知道嘛&#xff1f; Ensembl gene ID&#xff1a;Ensembl数据库中对基因的命名&#xff0c;如ENSMUSG00000000538。ENS是固定字符&#xff0c;表示…

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

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

基于SSM的零食销售系统

基于SSM的零食销售系统 零食商城系统是一个面向用户销售零食的在线平台&#xff0c;用户可以在该平台上浏览、搜索、选择和购买各种零食产品。零食商城系统的背景是随着生活水平的提高和消费观念的改变&#xff0c;人们对于各种健康、美味和方便的零食产品的需求不断增加。传统…

Verilog基础:编译指令`timescale

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

【独家OD2023C卷真题】20天拿下华为OD笔试2023C-小明能到达的最大坐标值【欧弟算法】全网注释最详细分类最全的华为OD真题题解

题目描述与示例 题目描述 小明在玩一个游戏&#xff0c;游戏规则如下&#xff1a;在游戏开始前&#xff0c;小明站在坐标轴原点处&#xff08;坐标值为 0&#xff09;给定一组指令和一个幸运数&#xff0c;每个指令都是一个整数&#xff0c;小明按照指定的要求前进或者后退指…

集成测试如何做?

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

C语言还会存在多久

一、C语言的生命力 在当前的科技发展和就业市场需求下&#xff0c;可以肯定地说C语言并没有像一些新兴语言&#xff08;如Python、JavaScript等&#xff09;那样受到大量的关注。然而&#xff0c;并不意味着学习C语言的人会越来越少。 首先&#xff0c;C语言作为一种深受尊重…

全网最新最全的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…

从无人驾驶汽车到虚拟助手:人工智能如何改变我们的世界

人工智能对我们的生活影响有多大 近年来&#xff0c;人工智能迅速发展&#xff0c;成为影响社会各个领域的重要技术。本文将深入探讨人工智能在无人驾驶汽车、虚拟助手等领域的应用和影响&#xff0c;剖析人工智能对我们的生活、工作和社交等方面所带来的深刻变革。 目录 人…

【上海大学《面向对象程序设计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…

【LeetCode 0125】【双指针】有效回文

题目 https://leetcode.com/problems/valid-palindrome/ 题解 双指针&#xff1a;左指针右移过程时跳过非法字符&#xff0c;右指针左移时跳过非法字符。 如果左指针大于等于右指针&#xff0c;表示有效回文&#xff1b;如果两指针所对应的字符如果不等&#xff0c;则不是有…

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…

配置Docker OpenWrt与宿主机网络互通且作为宿主机网关

目录 背景环境 操作步骤Docker安装OpenWrt确认宿主机网络接口名创建macvlan网络开启桥接网卡的混淆模式为docker创建macvlan网络 创建OpenWrt容器登录容器更改ip网段重启network生效配置 与宿主机网络互通宿主机创建新的macvlan接口为新接口分配ip并启用添加静态路由使宿主机与…

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

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

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

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