JWT令牌:实现安全会话跟踪与登录认证的利器
摘要:本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用,详细介绍了JWT令牌的概念、组成、生成与校验方法,以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤,为系统的安全认证机制提供了全面且深入的技术指导。
关键词:JWT令牌;会话跟踪;登录认证;生成与校验
参考资料:黑马程序员day12 完整项目请从第10天开始看
一、引言
在基于令牌技术实现会话追踪的背景下,本文着重介绍功能强大的JWT令牌,它作为用户身份标识,以字符串形式存在。接下来将详细阐述JWT令牌的相关知识及在项目中的具体应用。
二、JWT令牌
2.1 介绍
JWT,全称JSON Web Token,官网为https://jwt.io/ 。它定义了一种简洁且自包含的格式,用于在通信双方以json数据格式安全传输信息,凭借数字签名确保信息可靠。
- 简洁性:JWT表现为简单字符串,可在请求参数或请求头中直接传递。
- 自包含性:虽看似随机字符串,但可按需求在其中存储自定义数据,如用户相关信息。本质上,JWT是对原始json数据格式进行安全封装,实现通信双方的安全信息传输。
JWT令牌由三部分组成,各部分间以英文点号分隔:
- Header(头):记录令牌类型、签名算法等信息,例如:{“alg”:“HS256”,“type”:“JWT”} 。
- Payload(有效载荷):携带自定义信息、默认信息等,例如:{“id”:“1”,“username”:“Tom”} 。
- Signature(签名):用于防止Token被篡改,确保安全性。它通过将header、payload与指定秘钥结合,运用指定签名算法计算得出。签名机制使得JWT令牌极为安全可靠,一旦令牌中任何部分被篡改,校验时便会失败。
生成JWT令牌时,会对JSON格式数据进行base64编码。Base64是基于64个可打印字符表示二进制数据的编码方式,使用的字符包括A - Z、a - z、0 - 9、加号、斜杠,共64个字符,另加等号作为补位符号。需注意,Base64是编码方式,并非加密方式。
JWT令牌典型应用场景为登录认证,流程如下:
- 浏览器发起登录请求,访问登录接口,若登录成功,生成JWT令牌并返回给前端。
- 前端接收JWT令牌后存储,后续每次请求将其携带至服务端。
- 服务端统一拦截请求,判断是否携带令牌。若无令牌,拒绝访问;若有令牌,校验其有效性,有效则放行处理请求。
2.2 生成和校验
为在Java代码中生成和校验JWT令牌,首先需引入JWT依赖:
<!-- JWT依赖-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
引入依赖后,可借助工具类Jwts
提供的API完成操作。
- 生成JWT代码实现:
@Test
public void genJwt(){Map<String,Object> claims = new HashMap<>();claims.put("id",1);claims.put("username","Tom");String jwt = Jwts.builder().setClaims(claims) //自定义内容(载荷) .signWith(SignatureAlgorithm.HS256, "itheima") //签名算法 .setExpiration(new Date(System.currentTimeMillis() + 24*3600*1000)) //有效期 .compact();System.out.println(jwt);
}
运行上述测试方法,输出的结果即为生成的JWT令牌。可将令牌复制至JWT官网,粘贴于Encoded位置,自动解析令牌。解析后,第一部分显示所用签名算法为HS256;第二部分为自定义数据及设置的过期时间(exp),因前两部分采用base64编码,可直接解码;第三部分由签名算法计算得出,无法直接解析。https://jwt.io/#debugger-io
校验JWT令牌(解析生成的令牌):
@Test
public void parseJwt(){Claims claims = Jwts.parser().setSigningKey("itheima")//指定签名密钥(必须保证和生成令牌时使用相同的签名密钥) .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjcyNzI5NzMwfQ.fHi0Ub8npbyt71UqLXDdLyipptLgxBUg_mSuGJtXtBk").getBody();System.out.println(claims);
}
运行该测试方法,若解析过程未报错,说明解析成功,可看到解析出的id和过期时间。若篡改令牌(如修改header中的数字),解析时会报错,表明JWT令牌被篡改。此外,修改生成令牌时设置的过期时间,过期后再解析也会报错,说明JWT令牌过期后失效。
使用JWT令牌时需注意:
- JWT校验所用签名秘钥必须与生成JWT令牌时的秘钥配套。
- 若JWT令牌解析校验报错,则表明令牌被篡改或已失效,即令牌非法。
2.3 登录下发令牌
完成JWT令牌生成和校验的基础学习后,着手在案例中运用JWT令牌技术跟踪会话,主要包含生成令牌和校验令牌两步。首先实现登录成功后生成JWT令牌并返回给前端。
查看登录接口文档的响应数据部分可知,登录成功后系统下发JWT令牌,后续请求需在请求头header中以“token”为名称,携带登录时下发的JWT令牌。若检测到用户未登录,返回固定错误信息。
实现步骤:
- 引入JWT工具类:在项目工程下创建
com.itheima.utils
包,并将提供的JWT工具类复制到该包下。 - 登录完成后,调用工具类生成JWT令牌并返回
JWT工具类
public class JwtUtils {private static String signKey = "itheima";//签名密钥private static Long expire = 43200000L; //有效时间/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims)//自定义信息(有效载荷).signWith(SignatureAlgorithm.HS256, signKey)//签名算法(头部).setExpiration(new Date(System.currentTimeMillis() + expire))//过期时间.compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey)//指定签名密钥.parseClaimsJws(jwt)//指定令牌Token.getBody();return claims;}
}
登录成功,生成JWT令牌并返回
@RestController
@Slf4j
public class LoginController {//依赖业务层对象@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp) {//调用业务层:登录功能Emp loginEmp = empService.login(emp);//判断:登录用户是否存在if(loginEmp !=null ){//自定义信息Map<String , Object> claims = new HashMap<>();claims.put("id", loginEmp.getId());claims.put("username",loginEmp.getUsername());claims.put("name",loginEmp.getName());//使用JWT工具类,生成身份令牌String token = JwtUtils.generateJwt(claims);return Result.success(token);}return Result.error("用户名或密码错误");}
}
相关文章:
JWT令牌:实现安全会话跟踪与登录认证的利器
摘要:本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用,详细介绍了JWT令牌的概念、组成、生成与校验方法,以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤,为系统的安全认证机制提供了全面且深入的…...
uni-app/微信小程序接入腾讯位置服务地图选点插件
uni-app/微信小程序接入腾讯位置服务地图选点插件 0、常出现的错误及解决方法0.1插件未授权使用(见步骤1)0.2小程序类目不符合引用该类目插件的要求或主体类型不符合要求(见步骤1)0.3需要在app.json中声明permission scope.userLo…...
3款顶流云电脑与传统电脑性能PK战:START云游戏/无影云/ToDesk云电脑谁更流畅?
这里写目录标题 一、前言二、本地机器配置环境三、START云游戏/无影云/ToDesk云电脑配置对比3.1 START云游戏3.2 无影云个人版3.3 ToDesk云电脑 四、本地电脑与云电脑性能实战4.1 游戏场景体验4.1.1 本地电脑测试4.1.2 云电脑测试英雄联盟黑神话悟空其他游戏 4.2 主流设计场景体…...
WINUI——Background小结
在 WinUI/UWP XAML 中,Background(或其他颜色属性)支持 多种颜色表示方式,包括以下三种主流格式: 1. RGB 十六进制(不透明) 格式:#RRGGBB特点…...
公司内部自建知识共享的方式分类、详细步骤及表格总结,分为开源(对外公开)和闭源(仅限内部),以及公共(全员可访问)和内部(特定团队/项目组)四个维度
以下是公司内部自建知识共享的方式分类、详细步骤及表格总结,分为开源(对外公开)和闭源(仅限内部),以及公共(全员可访问)和内部(特定团队/项目组)四个维度&am…...
cursor AI编辑器的详细使用
以下是Cursor AI编辑器的详细使用介绍,涵盖核心功能、安装配置、使用技巧、高级应用及常见问题解决方案,结合了多个权威来源的实践指南和最新技术动态: 一、Cursor AI简介与核心功能 定位与架构 Cursor是基于Visual Studio Code(V…...
js逆向入门实战某某观察网响应数据解密
(base64解码 base64解码)地址:aHR0cHM6Ly93d3cuc3dndWFuY2hhLmNvbS9ob21lL2NpdHktZGV0YWlsP2NvZGU9MzEwMTAw 分析过程 1.抓数据包,发现响应数据是加密字符串。 2.对于这种回显数据解密,大概率通过拦截器实现,搜索intercepto…...
Ubuntu安装yum遇到Package ‘yum‘ has no installation candidate
环境说明 Window11,WSL2,Ubuntu24.04 错误描述 rootLAPTOP:~# apt-get install yum Reading package lists... Done Building dependency tree... Done Reading state information... Done Package yum is not available, but is referred to by anot…...
爱普生SG3225EEN低抖动差分晶振在网络通信的应用
在当今数字化时代,网络通信的飞速发展对数据传输的准确性、稳定性和高效性提出了极为严苛的要求。从 5G 通信网络的大规模部署,到数据中心的海量数据交换,再到智能家居系统的互联互通,每一个环节都离不开精准稳定的时钟信号作为支…...
软考教材重点内容 信息安全工程师 第22章 网站安全需求分析与安全保护工程
22.1.1 网站安全概念 网站是一个基于 B/S 技术架构的综合信息服务平台,主要提供网页信息及业务后台对外接口服务。一般网站涉及网络通信、操作系统、数据库、Web 服务器软件、Web 应用、浏览器、域名服务以及 HTML, XML,SSL; Web Services 等相关协议,同…...
数智读书笔记系列029 《代数大脑:揭秘智能背后的逻辑》
《代数大脑:揭秘智能背后的逻辑》书籍简介 作者简介 加里F. 马库斯(Gary F. Marcus)是纽约大学心理学荣休教授、人工智能企业家,曾创立Geometric Intelligence(后被Uber收购)和Robust.AI公司。他在神经科学、语言学和人工智能领域发表了大量论文,并著有《重启AI》等多部…...
UWB技术与5G、物联网结合的应用前景
一、核心应用场景与优势 工业自动化与智能制造 高精度设备协同:UWB技术(3cm定位精度)与5G(1ms级时延)结合,可实时追踪AGV、机械臂等设备位置,优化生产节拍,提升效率20…...
vue + element-plus自定义表单验证(修改密码业务)
写一个vue组件Password.vue 没有表单验证只有3个表单项 <template><div><el-form><el-form-item label"旧密码"><el-input></el-input></el-form-item><el-form-item label"新密码"><el-input>&l…...
如何将 Vue-FastAPI-Admin 项目的数据库从 SQLite 切换到 MySQL?
近期在github上看到一个开源项目,vue-fastapi-admin。它基于 FastAPI Vue3 Naive UI 的现代化前后端分离开发平台,融合了 RBAC 权限管理、动态路由和 JWT 鉴权,助力中小型应用快速搭建,也可用于学习参考。 由于该项目中数据库用…...
K8S运维实战之集群证书升级与容器运行时更换全记录
第一部分:Kubernetes集群证书升级实战 tips:此博文只演示一个节点作为示范,所有的集群节点步骤都可以参考。 项目背景 某金融业务系统Kubernetes集群即将面临生产证书集中过期风险(核心组件证书剩余有效期不足90天),…...
idea如何克隆拉取远程git项目到本地
概述 idea如何克隆拉取远程git项目到本地?方法很简单,找到入口,跟着引导窗口下一步下一步即可。 方法 File -> New -> Project from Version Control...然后根据引导窗口,一步一步操作即可...
聚铭网络亮相2025超云产品技术大会,联合发布“铭智安全运营大模型一体机及解决方案”
4月11日,于南京银城皇冠假日酒店举办的2025超云产品技术大会圆满落幕。聚铭网络受邀出席本次大会,并与超云联合发布了“铭智安全运营大模型一体机及解决方案”,为智能安全运营领域带来了全新突破。 会议背景 在全球人工智能技术加速产业化…...
成员访问运算符重载(详解)
目录 成员访问运算符 两层结构下的使用 三层结构下的使用(难点) 内存分析 成员访问运算符 成员访问运算符包括箭头访问运算符 -> 和解引用运算符 * ,它们是指针操作最常用的两个运算符。我们先来看箭头运算符 -> 箭头运算符只能以…...
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
作者:牧思 背景 随着云原生的普及,Golang 编程语言变得越来越热门。相比 Java,Golang 凭借其轻量,易学习的特点得到了越来越多工程师的青睐,然而由于 Golang 应用需要被编译成二进制文件再进行运行,Golan…...
项目后期发现重大漏洞,如何紧急修复
项目后期发现重大漏洞的紧急修复关键在于: 迅速识别漏洞根本原因、制定修复优先级、协调团队资源、实施快速修复和验证、总结经验防止重复发生。 其中,迅速识别漏洞根本原因是最为关键的一步。找到漏洞的根本原因有助于确保修复措施不仅解决眼前的问题&a…...
设计模式:状态模式 - 复杂状态切换的优雅之道
一、为什么用状态模式? 在开发过程中,你是否遇到过这样的难题:对象需要根据不同的状态执行不同行为,但代码中却充斥着大量的if-else或switch-case语句? 随着状态的增多,代码变得臃肿且难以阅读࿰…...
【AI提示词】业务开发经理
提示说明 业务开发经理旨在帮助用户构建一个高效、有洞察力的业务发展角色,能够在竞争激烈的市场中寻找并抓住商机。 提示词 # 角色 业务开发经理专家## 注意 - 业务开发经理应具备强烈的市场洞察力和人际沟通能力。 - 专家设计应考虑业务发展的实际需求和挑战。…...
发电机参数详解
一、发电机参数体系概述 发电机作为将机械能转换为电能的核心设备,其参数体系涵盖电气、机械、结构、性能、控制五大维度,是设备选型、运行维护、故障诊断的重要依据。参数体系的完整性和准确性直接影响电力系统的稳定性与经济性。以下通过思维导图展示发电机参数的整体架构…...
每天五分钟深度学习PyTorch:RNN CELL模型原理以及搭建
本文重点 RNN Cell(循环神经网络单元)是循环神经网络(RNN)的核心组成部分,用于处理序列数据中的每个时间步,并维护隐藏状态以捕获序列中的时间依赖关系。 RNN CELL的结构 RNN是一个循环结构,它可以看作是RNN CELL的循环,RNN CELL的结构如下图所示,RNN CELL不断进行…...
设计和实现一个基于 DDS(直接数字频率合成) 的波形发生器
设计和实现一个基于 DDS(直接数字频率合成) 的波形发生器 1. 学习和理解IP软核和DDS 关于 IP 核的使用方法 IP 核:在 FPGA 设计中,IP 核(Intellectual Property Core)是由硬件描述语言(HDL&a…...
RCEP框架下eBay日本站选品战略重构:五维解析关税红利机遇
2024年RCEP深化实施背景下,亚太跨境电商生态迎来结构性变革。作为协定核心成员的日本市场,其跨境电商平台正经历新一轮价值重构。本文将聚焦eBay日本站,从政策解读到实操路径,系统拆解跨境卖家的战略机遇。 一、关税递减机制下的…...
使用 Node.js、Express 和 React 构建强大的 API
了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始,到集成 React 前端,并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者,这篇文章都适合你。 今天&#…...
如何争取高层对项目的支持
争取高层对项目的支持关键在于明确项目的战略价值、展示其可行性与回报、以及有效的沟通和利益对接。高层管理者通常关注的是项目如何帮助公司实现整体战略目标,如何提高企业的竞争力或收益。在争取支持的过程中,项目经理需要清楚地表达项目的潜在价值&a…...
git合并分支原理
Git合并的原理是基于三方合并(three-way merge)算法,它通过比较三个快照来合并不同分支上的更改。这三个快照包括两个要合并的分支的最新提交和它们的共同祖先提交。合并过程并不是简单地按照提交时间来进行,而是通过比较这些快照…...
最短路问题
最短路问题 最短路问题 最短路算法(Shortest Path Algorithm)是用来解决图中两点之间的最短路径的问题。常见的应用包括:地图导航、网络路由、游戏寻路等。根据图的性质(有向/无向、是否有负权边)和需求(…...
ARM Cortex汇编伪指令
在ARM架构(尤其是Cortex-M系列MCU)的汇编中,伪指令(Pseudo-Instructions)是由汇编器解释的特殊指令,用于定义数据、符号、代码结构或控制汇编过程。以下是常用的ARM汇编伪指令分类及说明: 一、…...
如何在vue3项目中使用 AbortController取消axios请求
在 Vue3 项目中通过 AbortController 取消 Axios 请求,可以通过以下 结构化步骤 实现。我们结合组合式 API(Composition API)和现代前端实践演示: 一、基础实现(单个请求) 1. 创建组件逻辑 <script s…...
Bright+Data网页解锁器在旅游行业的创新实践
引言 随着在线旅游平台的快速发展,网络爬虫技术成为获取旅游数据的重要手段。然而,主流旅游网站(如去哪儿网、携程等)普遍部署了反爬虫机制,包括IP封禁、验证码验证、请求频率限制等技术手段,严重影响了传…...
SpringMVC 执行流程
前言: 在前后端分离的情况下,SpringMVC 的执行流程主要集中在处理 RESTful 请求和返回 JSON 数据。这里的 Controller 会直接返回数据,而不是视图。我们通常会使用 RestController 和 RequestMapping 来处理请求,ResponseBody 会…...
STM32G0单片机自带RTC
STM32有个自带RTC外设,外接32.768KHz的晶振后可得到相对精确的计时功能。 实测了一个一小时快个1秒多。 1 cubeMX设置了RTC后自动生成的初始化代码如下 static void MX_RTC_Init(void) {/* USER CODE BEGIN RTC_Init 0 *//* USER CODE END RTC_Init 0 */RTC_TimeT…...
Linux(9)Apache
文章目录 Apache1)概述2)部署方案3)yum安装Apache3.1、安装Apache3.2、启动Apache3.4、检查服务是否启动成功3.5、创建一个html页面3.6、yum安装Apache相关配置文件 4)源码安装Apache4.1、源码编译口诀4.2、安装Apache4.2.1、获取…...
用DeepSeek AI高效制作专业PPT
在当今职场中,制作精美而有力的PPT是展示想法、汇报工作和赢得机会的关键技能。然而,许多人花费过多时间在格式调整和内容组织上,而非专注于核心信息的传达。DeepSeek AI作为新一代智能助手,能够帮助您将PPT制作效率提升300%,同时显著提高专业度。本文将详细介绍如何利用D…...
C++红黑树
目录 一、红黑树的概念 二、红黑树的定义 三、红黑树的实现 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或者Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#…...
Day08 【基于jieba分词实现词嵌入的文本多分类】
基于jieba分词的文本多分类 目标数据准备参数配置数据处理模型构建主程序测试与评估测试结果 目标 本文基于给定的词表,将输入的文本基于jieba分词分割为若干个词,然后将词基于词表进行初步编码,之后经过网络层,输出在已知类别标…...
宝塔面板中解锁Laravel日志查看的奥秘
目录 一、前言二、Laravel 日志基础认知2.1 日志的作用2.2 Laravel 日志的默认配置 三、查找 Laravel 日志文件位置3.1 常规存储路径3.2 自定义路径查找 四、查看 Laravel 日志内容4.1 宝塔面板文件管理器查看4.2 使用命令行查看 五、常见问题及解决方法5.1 权限不足无法查看5.…...
基于MCP协议的多模态思维链在医疗系统改造中的融合研究
一、结构优化与内容整合编程方案 1. 强化MCP协议的技术映射 技术实现:上下文关联与动态资源适配 代码方案:基于Spring Cloud + OpenTelemetry的MCP协议集成 // MCP协议全局Trace ID生成与传递(Java示例) @Configuration public class MCPTraceConfig {@Beanpublic SpanP…...
js原型链污染
JavaScript 是一门非常灵活的语言,与 PHP 相比起来更加灵活。除了传统的 SQL 注入、代码执行等注入型漏洞外,也会有一些独有的安全问题,比如今天要说这个原型链污染。本篇文章就让我们来学习一下 NodeJS 原型链与原型链污染的原理。 什么是原…...
【HDFS入门】HDFS核心组件Failover Controller:高可用保障机制解析
目录 1 Failover Controller的角色职责 2 Failover Controller的运行原理 2.1 核心组件依赖 2.2 高可用架构图 3 故障转移机制详解 3.1 正常状态下的工作流程 3.2 故障触发切换流程 4 关键机制与技术挑战 4.1 防止脑裂(Fencing) 4.2 元数据同步 4.3 ZKFC…...
A008-Web 功能测试 – 咪咕音乐UI自动化,selenium
测试网址: https://music.migu.cn/v3 注 1:请设置足够的睡眠时间,保证网页顺利打开 注2:打开页面过程中, 网站可能有弹窗、验证信息,如果有,请手动关闭或重新运行代码, 保证后续流…...
Go:使用共享变量实现并发
竞态 在串行程序中,步骤执行顺序由程序逻辑决定;而在有多个 goroutine 的并发程序中,不同 goroutine 的事件先后顺序不确定,若无法确定两个事件先后,它们就是并发的。若一个函数在并发调用时能正确工作,称…...
私域流量运营:如何高效处理海量社群订单?
电商行业进入存量竞争时代,私域流量正悄然改写商业规则。这个被企业主们频频提及的概念,本质上是在构建自主可控的用户资产池——就像知名茶饮品牌「喜茶」通过会员系统沉淀3000万粉丝,实现复购率提升35%的数字化转型。当企业微信对话框、社群…...
【TI MSPM0】ADC进阶学习
一、学习内容 二、ADC配置讲解 转换时钟来源于本地的80mhz的振荡器,使得高速的12bits的转换可以达到4mhz的采样率 ADC转换过程分两个步骤,一是采样,二是转换 因此,配置中的是采样时钟 真正决定采样速率的是conversion clock 决定…...
一文读懂WPF系列之MVVM
WPF MVVM 什么是MVVMWPF为何使用MVVM机制WPFMVVM 的实现手段 INotifyPropertyChanged数据绑定的源端通知原理 PropertyChanged事件双向绑定的完整条件常见疑惑问题 什么是MVVM 翻译全称就是 model-view-viewmodel 3部分内容 以wpf的概念角度来解释就是 数据库数据源模型…...
WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
什么叫WPF的资源(Resource) 资源是保存在可执行文件中的一种不可执行数据。WPF中资源用ResourceDictionary类表示,这个类就是一个字典,字典的key和value都是object类型。所以在WPF中,资源可以可以是图像、字符串等所有的任意CLR对象…...
vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm
vue3环境搭建 node.js 安装 验证nodejs是否安装成功 # 检测node.js 是否安装成功----cmd命令提示符中执行 node -v npm -v 设置全局安装包保存路径、全局装包缓存路径 在node.js 安装路径下 创建 node_global 和 node_cache # 设置npm全局安装包保存路径(新版本…...