JWT令牌详解及Java中的使用实战

JWT令牌详解及Java中的使用实战

摘要

本文将深入解析**JWT(JSON Web Token)**的核心概念,通过图文并茂的方式详解其工作原理,并手把手教你在Java中实现JWT的生成、验证与解析。无论你是认证授权新手还是想巩固知识的老手,都能在这里找到实用干货!


目录

  1. 什么是JWT?
  2. JWT结构剖析
  3. Java实现JWT实战
  4. 核心API详解
  5. 安全指南
  6. 总结

1. 什么是JWT?

1.1 基本定义

JWT(JSON Web Token) 是一种轻量级的开放标准(RFC 7519),用于在各方之间安全传输JSON格式信息。其典型应用场景包括:

  • 🔑 身份认证(如替代Session)
  • 🔒 跨服务安全通信
  • 🌐 跨域认证(如OAuth2)

1.2 核心优势

特性说明
无状态服务端无需存储会话信息
跨语言支持所有主流语言均有成熟实现库
自包含性令牌自身携带用户信息及元数据
防篡改基于签名机制保障数据完整性

2. JWT结构剖析

2.1 令牌组成

JWT由三部分通过.连接组成:

header.payload.signature

2.1.1 Header(头部)
{"alg": "HS256",  // 签名算法"typ": "JWT"     // 令牌类型
}

Base64Url编码后形成第一部分

2.1.2 Payload(载荷)

包含声明(Claims),分为三类:

  • 注册声明(预定义字段,如exp过期时间)
  • 公共声明(自定义但需避免冲突)
  • 私有声明(业务自定义数据)

示例:

{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022
}

Base64Url编码后形成第二部分

2.1.3 Signature(签名)

通过指定算法对前两部分签名,确保数据完整。以HS256为例:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secretKey)

3. Java实现JWT实战

3.1 环境准备

推荐使用JJWT库(目前最流行的Java JWT库):

Maven依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>

3.2 生成JWT令牌

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;public class JwtDemo {// 生成安全密钥(HS256需要至少256位)private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);private static final long EXPIRATION_TIME = 86400000; // 24小时public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).claim("role", "admin") // 添加自定义声明.signWith(SECRET_KEY).compact();}
}

3.3 解析验证JWT

public static Claims parseToken(String token) {return Jwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token).getBody();
}// 使用示例
public static void main(String[] args) {String token = generateToken("user1");System.out.println("Generated Token: " + token);Claims claims = parseToken(token);System.out.println("Subject: " + claims.getSubject());System.out.println("Expiration: " + claims.getExpiration());System.out.println("Role: " + claims.get("role"));
}

4. 核心API详解

4.1 Jwts.builder() 方法链

方法作用
setSubject()设置主题(通常是用户ID)
setIssuedAt()设置令牌签发时间
setExpiration()设置过期时间
claim(key, value)添加自定义声明
signWith(key)指定签名密钥和算法

4.2 异常处理

解析时需捕获以下异常:

  • SignatureException: 签名不匹配
  • MalformedJwtException: 令牌结构错误
  • ExpiredJwtException: 令牌已过期
  • UnsupportedJwtException: 不支持的JWT格式

示例:

try {Claims claims = parseToken(token);
} catch (ExpiredJwtException ex) {System.out.println("令牌已过期!");
} catch (SignatureException ex) {System.out.println("签名验证失败!");
}

5. 安全指南

  1. 密钥管理

    • 生产环境避免硬编码密钥
    • 推荐使用密钥管理系统(如HashiCorp Vault)
  2. 传输安全

    • 必须通过HTTPS传输JWT
    • 避免URL参数传递(可能被日志记录)
  3. 存储策略

    • 浏览器端建议使用HttpOnly的Cookie
    • 移动端使用安全存储(如Android Keystore)
  4. 最佳实践

    • 设置合理的过期时间(建议≤24小时)
    • 敏感操作要求重新认证
    • 定期轮换签名密钥

6. 总结

通过本文,你应当已经掌握:

  • ✅ JWT的核心组成与工作原理
  • ✅ 在Java中生成/解析JWT的具体实现
  • ✅ 安全使用JWT的最佳实践

Q&A: 欢迎评论区提问交流!👨💻

注:  
1. 实际使用时请替换示例中的GitHub地址、博客链接和图片URL  
2. HS256的密钥生成方式仅用于演示,生产环境需使用更安全的密钥管理方案  
3. 建议在Web应用中结合过滤器进行JWT校验(如Spring Security的`OncePerRequestFilter`)

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

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

相关文章

晶圆隐裂检测提高半导体行业效率

半导体行业是现代制造业的核心基石&#xff0c;被誉为“工业的粮食”&#xff0c;而晶圆是半导体制造的核心基板&#xff0c;其质量直接决定芯片的性能、良率和可靠性。晶圆隐裂检测是保障半导体良率和可靠性的关键环节。 晶圆检测 通过合理搭配工业相机与光学系统&#xff0c…

Java 的 ReentrantLock

Java中的ReentrantLock是java.util.concurrent.locks包下提供的一个可重入互斥锁&#xff0c;用于替代synchronized关键字实现更灵活的线程同步。以下是其核心特性和使用方法的详细说明&#xff1a; 核心特性 可重入性 同一个线程可以重复获取同一个锁&#xff08;锁的持有计数…

达梦数据库-学习-23-获取执行计划的N种方法

目录 一、环境信息 二、说点什么 三、测试数据生成 四、测试语句 五、获取执行计划方法 1、EXPLAIN &#xff08;1&#xff09;样例 &#xff08;2&#xff09;优势 &#xff08;3&#xff09;劣势 2、ET &#xff08;1&#xff09;开启参数 &#xff08;2&#xff…

20200201工作笔记常用命令要整理

工作笔记常用命令&#xff1a; 1.repo常用命令&#xff1a; repo sync -c -j10 2. 常用adb命令 错误: error: device unauthorized. This adbds $ADB_VENDOR_KEYS is not set; try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your d…

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览 到2025年&#xff0c;虽然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在学术界仍有探讨&#xff0c;但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调&#xff08;PEFT&#xff09;方法取代 。LoRA因其实现简单、推理零开销&#…

9种方法,一键美化Python图表

Matplotlib、Seaborn默认参数不好看&#xff0c;美化需要大量代码。 本次分享9种方法&#xff0c;一键美化图表&#xff0c;看看那个是你的菜。 1 Matplotlib style sheets Matplotlib内置多类style sheets&#xff0c; 一行代码使用&#xff0c; plt.style.use(Solarize_Li…

在STM32上配置图像处理库

在STM32上配置并使用简单的图像滤波库(以实现均值滤波为例,不依赖复杂的大型图像处理库,方便理解和在资源有限的STM32上运行)为例,给出代码示例,使用STM32CubeIDE开发环境和HAL库,假设已经初始化好了相关GPIO和DMA(如果有图像数据传输需求),并且图像数据存储在一个二…

Android四大组件学习总结

​1. Activity 启动模式问题​ ​面试官​&#xff1a; “我看你项目里用了 SingleTask 模式&#xff0c;能具体说说为什么用它吗&#xff1f;如果从 Activity A&#xff08;SingleTask&#xff09;跳转到 B&#xff08;Standard&#xff09;&#xff0c;再返回 A&#xff0c;…

基于SamOutV8的序列生成模型实现与分析

项目概述 本项目实现了基于SamOutV8架构的序列生成模型&#xff0c;核心组件包括MaxStateSuper、FeedForward和DecoderLayer等模块。通过结合自注意力机制与状态编码策略&#xff0c;该模型在处理长序列时表现出良好的性能。 核心组件解析 1. MaxStateSuper&#xff08;状态编…

从脑电图和大脑记录中学习稳健的深度视觉表征

从脑电图和大脑记录中学习稳健的深度视觉表征 印度&#xff0c;印度&#xff0c;印度&#xff0c;印度大脑实验室&#xff0c;印度 例如&#xff0c;达拉普&#xff0c;克普拉萨德&#xff0c;山&#xff0c;山&#xff0c;新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…

2025.5个人感悟

本人是一名2025级大四学生&#xff0c;离毕业就一个月了&#xff0c;目前论文终稿已写完&#xff0c;有多的时间可以来写一写博客了。 &#xff08;1&#xff09;越焦虑什么&#xff0c;未来就有可能变成什么样子。以前一直焦虑考不上研&#xff0c;秋招找不到工作&#xff0c…

使用腾讯云3台轻量云服务器快速部署K8s集群实战

一、服务器配置 1.集群数量 节点ip备注master10.0.4.9安全组放通&#xff0c;3节点内网互通node110.0.4.14安全组放通&#xff0c;3节点内网互通node210.0.4.17安全组放通&#xff0c;3节点内网互通 2.配置服务器&#xff08;每个节点执行&#xff09; 执行步骤1 #在对应的…

bitbar环境搭建(ruby 2.4 + rails 5.0.2)

此博客为武汉大学WA学院网络安全课程&#xff0c;理论课大作业Web环境搭建。 博主搭了2天&#xff01;&#xff01;&#xff01;血泪教训是还是不能太相信ppt上的教程。 一开始尝试了ppt上的教程&#xff0c;然后又转而寻找网络资源 cs155源代码和docker配置&#xff0c;做到…

leetcode:2469. 温度转换(python3解法,数学相关算法题)

难度&#xff1a;简单 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度&#xff0c;以 摄氏度&#xff08;Celsius&#xff09;为单位。 你需要将摄氏度转换为 开氏度&#xff08;Kelvin&#xff09;和 华氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以数…

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

多视角三维重建系统 下面我将实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。 1. 环境准备与数据加载 首先安装必要的库: pip install opencv-python opencv-contrib-python numpy matplotlib plotly s…

什么是国密、密评、商密

一、国密 定义与本质&#xff1a;国密即国家密码管理局公布认定的国产密码算法&#xff0c;也称为商用密码&#xff08;在此语境下与国密通用&#xff09;&#xff0c;指能够实现商用密码算法的加密、解密和认证等功能的技术&#xff0c;涵盖密码算法编程技术和密码算法芯片、…

打卡35天

模型可视化与推理 知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化 进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观 推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&…

kafka之操作示例

一、常用shell命令 #1、创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看创建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生产者发布消息命令 &#xff08;执行完此命令后在控制台输入要发…

网络安全基础--第七课

路由表 路由器的转发原理&#xff1a;当一个数据包进入路由器&#xff0c;路由器将基于数据包中的目标IP地址&#xff0c;查询本地 路由表&#xff0c;若表中存在记录&#xff0c;则将无条件按记录转发&#xff0c;若没有记录&#xff0c;路由器不能泛洪&#xff0c;因为路由器…

Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果

书接上回&#xff1a;springBoot 整合 扣子cozeAI 智能体 对话https://blog.csdn.net/weixin_44548582/article/details/147457236 上文实现的是一次性等待并得到完整的AI回复内容&#xff0c;但随着问题和AI的逻辑日趋复杂&#xff0c;会明显增加这个等待时间&#xff0c;这对…