JWT(JSON Web Tokens)入门与Java实践

一、JWT简介

在现代Web应用中,身份验证和授权是确保系统安全性的关键环节。JSON Web Tokens(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络之间安全地传输信息。JWT可以被用作身份验证和授权的一种手段,允许双方之间安全地交换信息。

二、JWT的组成

JWT由三部分组成:Header(头部)、Payload(负载)和Signature(签名),这三部分通过点(.)分隔。

  1. Header(头部):通常包含两部分信息:令牌的类型(即JWT)和使用的签名算法,例如HMAC SHA256或RSA。这些信息以JSON形式表示,并被Base64Url编码。

示例:

{"alg": "HS256","typ": "JWT"
}
  1. Payload(负载):包含了一些声明(Claims),这些声明是关于实体(通常是用户)和附加的元数据。标准中定义了三种类型的声明:Registered、Public和Private claims。Registered claims是一组预定义好的声明,如iss(签发者)、exp(过期时间)等。负载信息也是JSON格式,同样被Base64Url编码。

示例:

{"sub": "user123","admin": true,"exp": 1516239022
}
  1. Signature(签名):签名部分用于验证消息的完整性和真实性。它是通过将Header和Payload部分使用Header中指定的算法加上一个密钥进行签名得到的。签名可以防止JWT在传输过程中被篡改。

三、JWT的工作流程

  1. 用户使用用户名和密码向服务器发送登录请求。
  2. 服务器验证用户信息,如果验证通过,则根据用户信息生成一个JWT,并将其返回给客户端。
  3. 客户端收到JWT后,可以将其存储在localStorage、cookie或其他客户端存储中,以便后续请求使用。
  4. 在之后的每次请求中,客户端需要将JWT放在HTTP请求头中的Authorization字段里发送给服务器。通常,这是通过在Authorization字段中添加“Bearer ”前缀来实现的,如“Authorization: Bearer ”。
  5. 服务器接收到请求后,会验证JWT的有效性和完整性。如果验证通过,则服务器会处理该请求;否则,服务器会返回错误响应。

四、Java中使用JWT

在Java中,有多个库可以帮助我们处理JWT,比如jjwt。下面是一个简单的例子,展示如何使用Java生成和验证JWT。

  1. 添加依赖

首先,你需要在项目的pom.xml中添加jjwt库的依赖(如果你使用的是Maven):

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> <!-- 请检查是否有更新的版本 -->
</dependency>
  1. 生成JWT

下面是一个简单的Java方法,用于生成JWT:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtUtil {private static final String SECRET_KEY = "yourSecretKey"; // 密钥,应该保存在安全的地方,不要硬编码在代码中private static final long EXPIRATION_TIME = 604800L; // 过期时间,这里设置为一周(单位为秒)public static String createToken(String userId) {Map<String, Object> claims = new HashMap<>();claims.put("user_id", userId);return Jwts.builder().setClaims(claims).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME * 1000)).signWith(SignatureAlgorithm.HS256, SECRET_KEY).compact();}
}
  1. 验证JWT

验证JWT的方法如下所示:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.lang.reflect.Method;public class JwtUtil {// ... 其他方法 ...public static void verifyToken(String token) throws Exception {Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();// 可以从这里获取存储在JWT中的信息,如用户ID等String userId = claims.get("user_id", String.class);System.out.println("User ID from token: " + userId);// 还可以检查token是否过期等其他验证逻辑...}
}

在实际应用中,你可能还需要处理一些异常情况,比如token过期、签名不匹配等。Jwts.parser().parseClaimsJws(token)方法会抛出异常,如果token无效或已过期。因此,在实际使用时,你应该将验证逻辑放在try-catch块中,并相应地处理这些异常。

五、安全性考虑

  • 使用HTTPS来传输JWT,以防止中间人攻击。
  • 不要在JWT中存储敏感信息,因为它们是可以被解码的(尽管它们是被签名的)。
  • 为JWT设置一个合理的过期时间,以防止旧token被长时间使用。
  • 定期更换签名密钥,以增加系统的安全性。
  • 使用安全的存储方式来保存签名密钥,不要将其硬编码在代码中或公开存储。
  • 在服务器端验证JWT时,确保验证其完整性和有效期,并对任何异常情况进行适当处理。

六、总结
本文介绍了JWT的基本概念、组成和工作流程,并提供了Java中使用JWT的示例代码。通过生成和验证JWT,你可以在Web应用中实现安全的身份验证和授权。在使用JWT时,请务必注意安全性考虑,并采取适当的措施来保护系统的安全。

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

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

相关文章

【AI】大模型的黑盒困惑

目录 一、人工智能大模型 二、大模型的黑盒特性 三、黑盒导致的问题 一、人工智能大模型 人工智能大模型是指使用深度学习技术构建的&#xff0c;具有庞大规模参数的神经网络模型。这些模型具有数以亿计的参数&#xff0c;能够对大量的数据进行训练&#xff0c;从而在各种任…

CMake入门教程【核心篇】安装(install)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2. 使用方法2…

如何从零开始搭建公司自动化测试框架?

一、为什么要搭建自动化测试框架 测试如果按照是否手工划分&#xff0c;可以分为“手工测试”和“自动化测试”。 “手工测试”也就是用人力来进行功能测试。相比自动化测试而言执行效率慢&#xff0c;可以进行探索性测试和发散性测试。 “自动化测试”主要是通过所开发的软…

SSE和websocket

SSE (Server-Sent Events&#xff0c;服务器推送事件) 是一种用于实现服务器向客户端推送实时数据的 Web 技术。 SSE 允许服务器在建立的 HTTP 连接上发送事件流&#xff0c;而不需要客户端发起请求。相比于传统的请求-响应模式&#xff0c;它提供了一种服务器主动推送数据给客…

Python控制程控电源(USB)

文章目录 前言一、环境搭建1.软件安装2.硬件安装二、设置程控电源连接方式三、Python代码四、验证结果五、pyd文件前言 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制…

nifi详细介绍--一款开箱即用、功能强大可靠,可用于处理和分发数据的大数据组件

目录 目录 一、引言 二、NiFi 的历史背景介绍 三、NiFi 是什么&#xff1f; 核心特性 应用领域 四、NIFI 入门 五 、NiFi 工作流程 六、实际应用场景 七、优势总结 一、引言 NiFi&#xff08;Apache NiFi&#xff09;&#xff0c;全名为“Niagara Files”&#xff0…

Docker把容器打包成镜像并迁移到另外一台服务器上运行

在Docker中&#xff0c;您可以通过两个步骤将容器打包成镜像&#xff0c;并将该镜像保存到本地文件系统中。以下是具体步骤&#xff1a; 将容器提交为镜像&#xff1a; 使用 docker commit 命令可以将现有的容器状态保存为新的镜像。这个过程类似于创建一个镜像的快照。 假设您…

Oracle修改用户密码

文章目录 Oracle修改用户密码Oracle用户锁定常见的两种状态Oracle用户锁定和解锁 Oracle修改用户密码 使用sys或system使用sysdba权限登录&#xff0c;然后执行以下命令修改密码&#xff1a; alter user 用户名 identified by 密码;密码过期导致的锁定&#xff0c;也通过修改…

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么&#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…

Redis:原理速成+项目实战——初识Redis、Redis的安装及启动、Redis客户端

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;首期文章 &#x1f4da;订阅专栏&#xff1a;Redis速成 希望文章对你们有所帮助 在此之前&#xff0c;我做过的项目里面也用到了…

利用深度学习图像识别技术实现教室人数识别

引言 在现代教育环境中&#xff0c;高效管理和监控教室成为了一个重要议题。随着人工智能技术的迅猛发展&#xff0c;特别是深度学习和图像识别领域的突破&#xff0c;我们现在可以通过智能系统来自动识别教室内的人数&#xff0c;从而实现更加智能化的教室管理。 深度学习与图…

LeetCode 84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

Spring-IOC综述

文章迁移自语雀。 怎么查看spring的文档 ioc综述 说到spring的ioc,其实就是控制反转,为啥需要控制反转呢,其实是为了功能的增强,如果不用spring, 我们直接使用工厂方法,静态工厂方法, 都是是可以获取到对象的,但是如果需求变了,我们在类的生成时,添加了很多信息,使用工厂就不…

【INTEL(ALTERA)】Arria V FPGA GPIO 引脚上的内部箝位二极管是否始终处于活动状态?

说明 当设备未通电或未配置设备时&#xff0c;英特尔 Arria V FPGA GPIO 引脚上的内部箝位二极管是否处于活动状态&#xff1f; 解决方法 根据 Arria V 器件手册&#xff1a;第 1 卷&#xff1a;设备接口和集成&#xff0c;片上钳位二极管功能通过 英特尔 Quartus Prime 软件…

【鸿蒙杂谈①】——鸿蒙基础介绍及应用领域

1.前言 小伙伴们大家好&#xff0c;最近被复习整的痛苦无比&#xff0c;所以今天咱们了解 一点轻松的东西&#xff0c;至于高并发就先放放吧。好了&#xff0c;废话不多说&#xff0c;咱们进入正题。 相信小伙伴们都已经看到了最近鸿蒙的势头了&#xff0c;那鸿蒙究竟是怎么发…

《Linux C编程实战》笔记:实现自己的myshell

ok&#xff0c;考完试成功复活 这次是自己的shell命令程序的示例 流程图&#xff1a; 关键函数 1.void print_prompt() 函数说明&#xff1a;这个函数打印myshell提示符&#xff0c;即“myshell$$”. 2.void get_input(char *buf) 函数说明&#xff1a;获得一条指令&#…

阿里云免费SSL证书有效期只有3个月?

阿里云免费SSL证书签发有效期从12个月缩短至3个月&#xff1a;尊敬的用户&#xff0c;根据供应商变更要求&#xff0c;免费证书&#xff08;默认证书&#xff09;的签发有效期将由12个月缩短至3个月。 免费证书&#xff08;升级证书&#xff09;的有效期不会改变。 没错&#…

Vue3-32-路由-重定向路由

什么是重定向 路由的重定向 &#xff1a;将匹配到的路由 【替换】 为另一个路由。 redirect : 重定向的关键字。 重定向的特点 1、重定向是路由的直接替换,路由的地址是直接改变的&#xff1b; 2、在没有子路由配置的情况下&#xff0c;重定向的路由可以省略 component 属性的配…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何&#xff1f; 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…

【IC覆盖率】

覆盖率分享 1 覆盖率提高策略2 覆盖率类型2.1 代码覆盖率2.2 功能覆盖率2.3 Waive提高覆盖率 覆盖率是用于衡量设计的完备性&#xff0c;进行指导分析发现没覆盖到的盲区&#xff0c;通过修改约束或者追加定向case来提到覆盖率&#xff1b; 1 覆盖率提高策略 1.首先最先的是每…