Java的JJWT实现JWT

article/2025/11/9 15:53:57

1 什么是 JJWT

JJWT 是一个提供端到端的 JWT 创建和验证的 Java 库。永远免费和开源 (Apache License,版本2.0),JJWT 很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。

2 token 的创建

2.1 引入依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

2.2 CreateJWT 类

用于生成 token。

public class CreateJWT {public static void main(String[] args) {JwtBuilder jwtBuilder = Jwts.builder().setId("666777").setSubject("脑浆消融").setIssuedAt(new Date()).signWith(SignatureAlgorithm.HS256, "HelloWorld");System.out.println(jwtBuilder.compact());}
}
  • setIssuedAt:用于设置签发时间。
  • signWith:用于设置签名秘钥。

2.3 生成 token

第一次:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjY3NzciLCJzdWIiOiLohJHmtYbmtojono0iLCJpYXQiOjE2MDg4MDY3MDd9.v1SRR_xChK-K_T5GuHObQy5BnCOyZgGxBX-vrqBWwZg

再次运行,会发现每次运行的结果是不一样的,因为我们的载荷中包含了时间:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjY3NzciLCJzdWIiOiLohJHmtYbmtojono0iLCJpYXQiOjE2MDg4MDY3ODV9.Da6HfKuSowFkWKmazLzFQSvkWzMPYNCEuNu12Q7e8mM

3 token 的解析

我们刚才已经创建了 token ,在 web 应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个 token(这就好像是拿着一张门票一样),那服务端接到这个 token 应该解析出 token 中的信息(例如用户 id),根据这些信息查询数据库返回相应的结果。

3.1 ParserJwtTest 类

传入盐和 token,解析 JWT 携带的信息。

public class ParserJwtTest {public static void main(String[] args) {Claims claims = Jwts.parser().setSigningKey("HelloWorld").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjY3NzciLCJzdWIiOiLohJHmtYbmtojono0iLCJpYXQiOjE2MDg4MDY3ODV9.Da6HfKuSowFkWKmazLzFQSvkWzMPYNCEuNu12Q7e8mM").getBody();System.out.println("用户ID:" + claims.getId());System.out.println("用户名:" + claims.getSubject());System.out.println("登陆时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getIssuedAt()));}
}

在这里插入图片描述
试着将 token 或签名秘钥篡改一下,会发现运行时就会报错,所以解析 token 也就是验证 token。

例如,把 token 末尾的 mM 删除掉,就会报错:
在这里插入图片描述

4 token 过期校验

有很多时候,我们并不希望签发的 token 是永久生效的,所以我们可以为 token 添加一个过期时间。

4.1 修改 CreateJWT

public class CreateJWT {public static void main(String[] args) {JwtBuilder jwtBuilder = Jwts.builder().setId("666777").setSubject("脑浆消融").setIssuedAt(new Date()).signWith(SignatureAlgorithm.HS256, "HelloWorld").setExpiration(new Date(new Date().getTime() + 60000));System.out.println(jwtBuilder.compact());}
}
  • setExpiration 方法:用于设置过期时间。

4.2 修改 ParserJwtTest

多添加一个过期时间。

public class ParserJwtTest {public static void main(String[] args) {Claims claims = Jwts.parser().setSigningKey("HelloWorld").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjY3NzciLCJzdWIiOiLohJHmtYbmtojono0iLCJpYXQiOjE2MDg4MDk3NzksImV4cCI6MTYwODgwOTgzOX0.kAroSbh6Q5PzoA0iUxNtlpBVipvA6Zb2O3OcEFJkF88").getBody();System.out.println("用户ID:" + claims.getId());System.out.println("用户名:" + claims.getSubject());System.out.println("登陆时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getIssuedAt()));System.out.println("过期时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getExpiration()));}
}

1 分钟之内,token 可以使用:
在这里插入图片描述
1 分钟之后,过期时会引发 io.jsonwebtoken.ExpiredJwtException 异常:
在这里插入图片描述

5 自定义 claims

我们刚才的例子只是存储了 id 和 subject 两个信息,如果你想存储更多的信息(例如角色)可以自定义 claims。

5.1 修改 CreateJWT

多添加两个 claims.

public class CreateJWT {public static void main(String[] args) {JwtBuilder jwtBuilder = Jwts.builder().setId("666777").setSubject("脑浆消融").setIssuedAt(new Date()).signWith(SignatureAlgorithm.HS256, "HelloWorld").setExpiration(new Date(new Date().getTime() + 60000)).claim("sex", "man").claim("age", "25");System.out.println(jwtBuilder.compact());}
}

5.2 修改 ParserJwtTest

Jwt 解析类打印出 sex 和 age。

public class ParserJwtTest {public static void main(String[] args) {Claims claims = Jwts.parser().setSigningKey("HelloWorld").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NjY3NzciLCJzdWIiOiLohJHmtYbmtojono0iLCJpYXQiOjE2MDg4MDk3NzksImV4cCI6MTYwODgwOTgzOX0.kAroSbh6Q5PzoA0iUxNtlpBVipvA6Zb2O3OcEFJkF88").getBody();System.out.println("用户ID:" + claims.getId());System.out.println("用户名:" + claims.getSubject());System.out.println("登陆时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getIssuedAt()));System.out.println("过期时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(claims.getExpiration()));System.out.println("性别:" + claims.get("sex"));System.out.println("年龄:" + claims.get("age"));}
}

5.3 结果

在这里插入图片描述


http://chatgpt.dhexx.cn/article/P3d0EKQG.shtml

相关文章

解决Red Hat虚拟机与主机网络不通

虚拟机版本&#xff1a;Red Hat Enterprise Linux 7 64 位 安装&#xff1a;自定义安装&#xff0c;带GUI的服务器&#xff0c;创建图形化界面 创建完毕后发现网络ping不通&#xff0c;经过查阅各种资料&#xff0c;在同事的帮助下终于解决。做一个记录。 1、VMware网络配置。…

虚拟机VMware和宿主机连接

文章目录 一、NAT连接1.查看宿主机IP地址2.设置VMnet8信息2.设置虚拟机模式3.设置虚拟网络4.设置虚拟机内系统IP&#xff08;Centos8.2为例&#xff09;4.1.图形化操作4.1.1DHCP4.1.2静态IP4.1.3 重启网卡&#xff08;修改网卡信息后&#xff09; 5.测试5.1.宿主机ping虚拟机5.…

VMware虚拟机三种网络连接模式详解

VMware虚拟机三种网络连接模式详解 Vmware提供了三种网络工作模式&#xff0c;分别是&#xff1a;&#xff08;1&#xff09;Bridged&#xff08;桥接模式&#xff09;&#xff1b;&#xff08;2&#xff09;NAT&#xff08;网络地址转换模式&#xff09;&#xff1b;&#xf…

虚拟机与主机之间通信

1.bridged(桥接方式&#xff0c;默认使用vmnet0虚拟网卡)&#xff1a; 选择这种模式&#xff0c;虚拟机等同于网络内的一台物理主机&#xff0c;可对手动设置IP&#xff0c;子网掩码。DNS&#xff0c;且IP地址要和主机的IP在同一网段内。这样。虚拟机就和主机如同连在一个HUB上…

虚拟机的几种网络连接方式

系列运维 文章目录 系列运维前言一、几种网络连接方式各是什么&#xff1f;二、网络连接的差异性总结 前言 VirtualBox中有4种网络连接方式&#xff1a; NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种&#xff0c;VirtualBox只是比VMWare多了Internal方式。…

主机、虚拟机、开发板之间网络连接设置

最近在玩开发板&#xff0c;主机使用的无线网卡&#xff0c;开发板与主机网线直连&#xff0c;现在开发板想使用tftp直接从虚拟机下载镜像等文件&#xff0c;偶尔又需要虚拟机从主机下载文件&#xff0c;虚拟机有时候又需要网络&#xff0c;经过一番折腾算是调试成功。 1.主机…

vmware虚拟机与主机共享网络

我的虚拟机总是各种连不上网&#xff0c;每次都要折腾一番。现在我把虚拟机连不上网的原因总体排查一下&#xff0c;按照流程一步步来&#xff0c;基本上可以解决大部分人的问题。 首先&#xff0c;在VMware的编辑->虚拟网络编辑器重新建立&#xff2e;&#xff21;&#xf…

Virtualbox虚拟机与主机相互访问

刚从vmware切换到Virtualbox有些地方还是不太熟悉。网络连接这块就被卡了一下&#xff0c;后来发现其实很简单&#xff0c;是我想多了。 环境 主机&#xff1a; archlinux 虚拟机&#xff1a;windows 10 软件版本&#xff1a;VirtualBox 6.1 理论上这些环境不影响&#xff0…

虚拟机和主机无法连接

vm网络配置&#xff1a;https://www.cnblogs.com/aeolian/p/8882790.html 一、首先查看自己的虚拟机服务有没有开启&#xff0c;选择电脑里面的服务查看&#xff1b; 1.计算机点击右键选择管理 2.进入管理选择VM开头的服务如果没有开启的话就右键开启 二、虚拟机服务开启后就…

虚拟机和主机的网络访问

本人的问题是主机可以ping虚拟机&#xff0c;虚拟机可以正常访问端口&#xff0c;主机不能访问虚拟机端口&#xff0c;然后就进行各种问题的排查&#xff0c;一开始把所有的防火墙都关了还不行&#xff0c;所以来到了windows主机虚拟网卡这里设置&#xff0c;使用了手动设置虚拟…

VMwareWorkstationPro虚拟机与主机远程连接

目录 一 &#xff0c;虚拟机与主机远程连接环境设置 二 虚拟机与主机远程连接 一 &#xff0c;虚拟机与主机远程连接环境设置 1 点击设置打开系统选项 2 打开远程控制 3 点击设置打开更新和安全 4 关闭病毒防护和防火墙 &#xff08;注&#xff1a;主机与虚拟机都要执行…

ubutu虚拟机和主机共享同一网络

ubutu虚拟机和主机共享同一网络 前言一、使用场景二、vmware设置三、主机windows设置四、虚拟机ubuntu配置 前言 ​ 本文采用的是共享同一网卡的方式达到虚拟机使用和主机一样的网络的目的。主要参考了虚拟机共享主机网卡连接的第一部分内容&#xff0c;感兴趣的朋友可以去大佬…

虚拟机三种网络连接方式

第一种连接方式-桥接模式 原理图&#xff1a; 桥接模式效果&#xff1a;通过桥接&#xff0c;我们让vm虚拟机和真正主机pc3处在了一片局域网下&#xff0c;vm虚拟机可以访问pc123也可以外网&#xff08;Internet)&#xff0c;同时pc123也可以访问vm虚拟机。好处是vm虚拟机可以…

VMware 虚拟机与主机网络互通

VMware连接网络 一、虚拟机服务开启二、本地网络虚拟机的网卡启动三、设置虚拟机四、IPv4设置 一、虚拟机服务开启 1.右击“此电脑”图标&#xff0c;单击“管理”&#xff0c;出现以下界面。 查看VMware是否开启&#xff0c;没有开启的话&#xff0c;就右击→“启动”。 二…

虚拟机仅主机连接模式设置

系统——网络连接 上面输入的地址通过命令ipconfig在本地查到的VMnet1对应的Ipv4地址即可&#xff0c;一般默认网关前三位和地址的一样&#xff0c;最后一个为1&#xff0c;即***.***.***.1 最后设置虚拟接的选项 这样仅主机模式就设置好了&#xff0c;设置了之后&#xff0c;虚…

VMware Workstations 虚拟机和主机网络配置

在Windows上安装虚拟机&#xff0c;是在学习使用Linux时的常用手段&#xff0c;在当我们安装好虚拟机之后&#xff0c;怎么配置虚拟机和物理机直接的网络通信呢&#xff0c;这里以Ubuntu系统为例 先简单描述一下NAT和桥接 在安装虚拟机的时候&#xff0c;一般来说&#xff0c;…

Linux 虚拟机和主机互通 [万能方法]

VMware Linux 虚拟机和主机互通 [万能方法] 前言&#xff1a;诸如以下问题&#xff0c;解决问题的思路都是一样的&#xff0c;看完此文后都能找到答案&#xff1a; 主机为何 ping 不通 虚拟机&#xff1f;请检查是否在同一网段&#xff1f;Linux 防火墙是否为开启状态&#x…

VMWARE虚拟机与主机远程连接

VMWARE虚拟机与主机远程连接 #1准备工作 首先准备一台虚拟机&#xff0c;然后点击启动 搜索内点击搜索系统然后打开 点击远程桌面 点击防火墙和网络保护&#xff0c;关闭所有防火墙&#xff08;虚拟机内也需要关闭&#xff09; ##2远程连接 虚拟机内点击搜索网络&#xff0c…

Linux虚拟机的网络连接模式

1.桥接模式 桥接模式中主机起到了网桥的作用&#xff0c;相当于通过主机上绕了下路&#xff0c;使得所有的虚拟机都可以通过这条路连接到路由器&#xff0c;从而直接连接外部物理网络&#xff0c;在这种模式下虚拟机和主机都是直接连接到路由器上的&#xff0c;本质上在这种模式…

VMware、linux虚拟机设置网络实现虚拟机与主机网络互通

需要配置三个方面才可以&#xff0c;即&#xff1a;WMware网络配置、windows主机网络配置、虚拟机网络配置。 首先&#xff0c;确认VMware虚拟机设置中配置的网络连接方式为&#xff1a;NAT模式 可以在VMware上方的菜单中找到&#xff1a;虚拟机---->设置&#xff0c;然后…