[java]关于Session关于Token关于JWT

news2024/12/28 5:22:40

目录

关于Session

关于Token

关于JWT


关于Session

HTTP协议是一种无状态协议,即:当某个客户端向服务器发起请求,服务器端进行处理,后续,此客户端再次发起请求,服务器端并不能直接知道它就是此前来访过的客户端。

从软件技术上,可以使用Session机制来识别客户端的身份,当某个客户端第1次向服务器端发起请求,服务器端会生成一个随机的Session ID(本质上是一个UUID值)并响应给客户端,后续,客户端每次请求时,都会携带这个Session ID来访问服务器端,而服务器端的内存中,使用K-V结构记录每个客户端对应的数据,使用Session ID作为Key,所以,每个客户端在服务器端都有一份属于自己的数据,这个数据就是Session。

由于Session是保存在服务器端的内存中的数据,所以:

  • 不适合存储特别大的数据

    • 可以通过开发规范来解决

  • 不便于应用到集群或分布式系统

    • 可以通过共享Session的做法缓解此问题

  • 不适合长期存储数据(存在内存里面资源紧张,如果时间有效期设置为一个星期,外一此时有很多人来访问,他们的session数据都不销毁,内存就会放不下了。清除机制清除太慢了)

    • 无解

提示:Spring Security的SecurityContext默认情况下也是基于Session的。

Session不适合长期存储数据,但很多场景是需要长时间保存的,比如微信登录进去很长时间都不需要再次登录,Token可以很好的解决这个问题。

关于Token

Token:票据,令牌

当某个客户端第1次向服务器端发起请求,服务器端会生成Token并响应给客户端,后续,客户端每次请求时,都会携带这个Token来访问服务器端,与Session ID不同,Token本身是有意义的数据,例如,可以包含用户的ID,或用户名等(完全由你来设计),对于服务器端而言,只需要具备“验证并解读Token”的机制即可,并不需要在服务器端保存相关的数据。(好比我们做飞机,我们拿自己的身份证,机场有验证我身份证的机制就可以,对方就能识别我们的身份)

由于Token的机制决定了,它天生就适用于集群和分布式系统中,并且,可以非常长时间的保存用户的身份信息!

提示:虽然Token比Session能解决更多的问题,但是,Token的整个使用过程都需要自行编写代码来实现,而Session则简单很多,所以,如果开发特别小型的项目,对存储用户身份信息也没有“长时间”这样的要求,用Session其实更方便。

Token是一个很大的一个概念, 只要是使用一组数据去记录下你是谁,这个东西就可以叫Token,Token里面怎么去记数据,记多个数据的时候怎么去组织,是什么格式是有讲究的,目前主流的是JWT,它是Token的一种,Token是大概念,JWT是小概念。

关于JWT

JWTJSON Web Token

JWT的官网:JSON Web Tokens - jwt.io

访问官网的主页,就可以看到JWT的数据表现格式 (下图红色框)。回头,当你的客户端尝试去找服务器做登录,然后服务器验证用户名密码什么的都没问题,然后就会生成一个这个JWT数据给到客户端,以后客户端每次提交请求都要把这个玩意给带上,然后服务器收到后去解析,解析出包含用户名,包含你的ID等等,就能够从中解读出你的身份来了,这就是JWT。

很显然这条数据是经过编码的一条数据,所谓编码就是通过一种算法把一组数据变成另外一组数据,比如加密也是编码的一种。在它的右边部分就是它的原始数据。

从它的原始数据可以看出,它包含三个部分,即

每个JWT数据都是由3大部分组成:

  • Header(头部):声明算法与Token类型(例如下图的算法用的是“HS256”,Token类型是JWT)

  • Payload(载荷):数据(这部分是你想放什么数据就放什么数据,比如用户名,用户ID等)

  • Verify Signature(验证签名)

这部分会算出一部分数据,主要是辨别这组JWT数据是否有效,或者是否伪造,因为我们说Token是一张票,你买票了以后,这个票就在自己手上,然后回头你去拿这张票,服务器就能识别你的身份。但是票在你手上,你是不是可以改啊,所以有某种机制能够识别出你这张票是真的还是假的。

 以上是Token的三个部分,所以回头如果我们想生成一个Token就需要准备这三部分数据,才能得到最终编码后的一个数据。

假设现在已经准备好了这三部分,怎么得到编码后的一个Token数据呢?需要用到一些工具包:

 里面列举了各种编程语言的主流的工具包,我们选择java的:

 点进去以后能看到7个java的工具包库(有一些比如算法之间的不同),随便用一个。案例中用的下图这一个

使用它的需要的依赖项:

<jjwt.version>0.9.1</jjwt.version>
<!-- JJWT(Java JWT) -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>${jjwt.version}</version>
</dependency>

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

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

相关文章

chatgpt赋能python:Python怎么多行输入?教你高效开发!

Python怎么多行输入&#xff1f;教你高效开发&#xff01; 1. 介绍 Python是一种可读性高、可编程性强、拥有丰富的第三方模块和库的高级编程语言。作为典型的解释型语言&#xff0c;它可在多个平台上进行开发和运行&#xff0c;凭借其优雅、简洁、高效的语法风格和强大的功能…

Linux下C/C++ 多线程SSH扫描与暴力攻击

Secure Shell&#xff08;安全外壳协议&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。 为什么需要SSH 如果没有SSH&#xff0c;绝大…

chatgpt赋能python:Python怎么安装skimage?

Python怎么安装skimage&#xff1f; 如果你之前使用Python编程&#xff0c;你可能会遇到需要安装第三方库的情况。对于图像处理任务&#xff0c;你可能需要用到scikit-image&#xff08;也称为skimage&#xff09;这个库。本文将提供一个详细的指南来安装skimage。 1. 确保你…

【JVM篇】类加载过程详解

目录 1、类加载过程概述 2、加载 3、连接 3.1 验证 3.1.1 文件格式验证 3.1.2 元数据验证 3.1.3 字节码验证 3.1.4 符号引用验证 3.2 准备 3.3 解析 4、初始化 1、类加载过程概述 想必大家一般在网上看类加载过程的资料时&#xff0c;通常资料只会将类加载过程概括…

OMG--DDS(Data Distribution Service)

OMG--DDS&#xff08;Data Distribution Service&#xff09; 1 介绍1.1 概述1.2 OMG 涉及的规范 2 内容概述介绍目标 Data-Centric Publish-Subscribe (DCPS) 以数据为中心的发布-订阅概要Platform Independent Model (PIM) 平台独立模型格式和约定概念图总体概念模型PIM 描述…

ChatGPT工作提效之数据可视化大屏组件Echarts的实战方案(大数据量加载、伪3D饼图、地图各省cp中心坐标属性、map3D材质)

ChatGPT工作提效系列文章目录 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式ChatGPT工作提效之小鹅通二次开发批量API对…

【电路】电路与电子技术基础 课堂笔记 第7章 晶体管放大电路

7.1 放大的概念 7.1.1 放大电路基础 放大电路可以将电信号不失真地进行放大&#xff0c;而且是幅度放大&#xff1b; 本质上&#xff0c;放大是对能量进行控制和转换&#xff0c; 由一个能量较小的输入信号控制直流电源&#xff0c; 将直流电源的能量转换成与输入信号频率…

yolov8量化部署(基于openvino和tensorrt)

yolov8 openvino量化部署 环境配置&#xff1a; pip install ultralytics && pip install openvino-dev将pytorch模型转为openvino模型: from ultralytics import YOLO# Load a model model YOLO("./yolov8n.pt") # load an official model# Export the…

S7-200 PLC编程软件介绍

更多关于西门子S7-200PLC内容请查看&#xff1a;西门子200系列PLC学习课程大纲(课程筹备中) 西门子200PLC编程软件采用的是STEP 7-Micro/WIN 软件。它可以进行编写程序&#xff0c;PLC程序下载与上传&#xff0c;编程向导&#xff0c;程序编译&#xff0c;PLC程序监控等等功能…

软件工程开发文档写作教程(12)—概要设计书的编制目标

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 概要设计书概述 《概要设计说明书》又称为《系统设计说明书》&#xff0c;编制的目的是说明…

Cracking C++(10): 基本的输入输出流

文章目录 1. 目的2. I/O Streams 输入/输出流3. Stream Operators 流操作符4. 禁止使用 std::endl5. 缓冲区&#xff1a;直观理解6. References 1. 目的 查看 hackingcpp 上的 Input & Output (Basics) 教程后的笔记和拓展内容。 2. I/O Streams 输入/输出流 使用 C 的标…

chatgpt赋能python:合并多个文件——Python的终极解决方案

合并多个文件——Python的终极解决方案 Python是一种高级编程语言&#xff0c;其简单明了的语法和丰富的库使其成为开发者的首选语言之一。在日常编码中&#xff0c;我们有时候需要将多个文件合并成一个文件以便于处理。这篇文章将详细介绍Python如何进行多个文件的合并。 什…

高数下——查漏补缺

期末复习 一、向量与空间几何 二、多元函数与重极限 2.1定义域 2.2 二元函数重极限

【实战】体验SadTalker

论文http://openaccess.thecvf.com//content/CVPR2023/papers/Zhang_SadTalker_Learning_Realistic_3D_Motion_Coefficients_for_Stylized_Audio-Driven_Single_CVPR_2023_paper.pdf github GitHub - OpenTalker/SadTalker: [CVPR 2023] SadTalker&#xff1a;Learning Realist…

chatgpt赋能python:Python如何合并单元格-实用技巧教程

Python如何合并单元格 - 实用技巧教程 单元格合并是Excel文件和Word文档等办公软件中很常见的功能&#xff0c;而使用Python对数据进行处理时&#xff0c;也可能需要实现合并单元格的操作。本文将为大家介绍Python中实现合并单元格的方法&#xff0c;并给出代码示例。 什么是…

HTML段落标签

HTML段落标签 段落标签 显示特点&#xff1a; 代码&#xff1a; 显示效果&#xff1a; 总结&#xff1a; 答案&#xff1a;

Java性能权威指南-总结10

Java性能权威指南-总结10 垃圾收集算法理解G1垃圾收集器 垃圾收集算法 理解G1垃圾收集器 G1垃圾收集器是一种工作在堆内不同分区上的并发收集器。分区(region)既可以归属于老年代&#xff0c;也可以归属于新生代(默认情况下&#xff0c;一个堆被划分成2048个分区),同一个代的…

chatgpt赋能python:如何取消Python中的科学计数法

如何取消Python中的科学计数法 Python是一种面向对象、解释型的高级编程语言。由于它在数值计算、科学计算以及数据分析等领域的强大功能&#xff0c;Python语言已经成为科学计算和机器学习领域中最常用的语言之一。 然而&#xff0c;当我们进行大量运算时&#xff0c;Python…

[SpringBoot]Spring Security框架

目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征 关于Spring Security的配置 关于默认的登录页 关于请求的授权访问&#xff08;访问控制&#xff09; 使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCry…

chatgpt赋能python:Python和Java:如何结合使用以提高开发效率

Python和Java&#xff1a;如何结合使用以提高开发效率 Python和Java是两种非常流行的编程语言&#xff0c;它们各自有自己的优势和用途。但有时候&#xff0c;我们需要将它们结合起来使用&#xff0c;以便更好地完成某些任务。在本文中&#xff0c;我们将介绍如何通过使用Java…