JWT在springbot3+JDK17下的适配

news/2024/10/9 7:00:40

依赖导入

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
<!--非JDK17不用导入如下依赖-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version>
</dependency>
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId>
</dependency>
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.0</version>
</dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.3.0</version>
</dependency>
<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-core</artifactId><version>2.3.0</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>

JWT工具类

package com.shuwei.dai;import io.jsonwebtoken.*;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;public class AppJwtUtil {// TOKEN的有效期一天(S)private static final int TOKEN_TIME_OUT = 3_600;// 加密KEYprivate static final String TOKEN_ENCRY_KEY = "SMDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";// 最小刷新间隔(S)private static final int REFRESH_TIME = 300;// 生产IDpublic static String getToken(Long id) {Map<String, Object> claimMaps = new HashMap<>();claimMaps.put("id", id);long currentTime = System.currentTimeMillis();return Jwts.builder().setId(UUID.randomUUID().toString()).setIssuedAt(new Date(currentTime))  //签发时间.setSubject("system")  //说明.setIssuer("heima") //签发者信息.setAudience("app")  //接收用户.compressWith(CompressionCodecs.GZIP)  //数据压缩方式.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式.setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000))  //过期时间戳.addClaims(claimMaps) //cla信息.compact();}/*** 获取token中的claims信息** @param token* @return*/private static Jws<Claims> getJws(String token) {return Jwts.parser().setSigningKey(generalKey()).parseClaimsJws(token);}/*** 获取payload body信息** @param token* @return*/public static Claims getClaimsBody(String token) {try {return getJws(token).getBody();} catch (ExpiredJwtException e) {return null;}}/*** 获取hearder body信息** @param token* @return*/public static JwsHeader getHeaderBody(String token) {return getJws(token).getHeader();}/*** 是否过期** @param claims* @return -1:有效,0:有效,1:过期,2:过期*/public static int verifyToken(Claims claims) {if (claims == null) {return 1;}try {claims.getExpiration().before(new Date());// 需要自动刷新TOKENif ((claims.getExpiration().getTime() - System.currentTimeMillis()) > REFRESH_TIME * 1000) {return -1;} else {return 0;}} catch (ExpiredJwtException ex) {return 1;} catch (Exception e) {return 2;}}/*** 由字符串生成加密key** @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}public static void main(String[] args) {/* Map map = new HashMap();map.put("id","11");*/System.out.println(AppJwtUtil.getToken(1102L));Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_zWLSQrDMAwA_6JzDF7kJfmNgmXiQMAgB1pK_17l0NsMw3zgnB02wJrD2gobXFsyaFsx1Kw30VcX9siJU4AFOk3YXPYFrXM-LiD3rre8ZfL1dBHVg_tFanRXNRpDmV_jf2J-zq4tfn-EHnvSgAAAAA.JIjyu9IPQE3ABX3_6YUJHfaPXDBxzCYze2T5yF7nIvOuAZyFurTi_Ii441w_0e5luoGQacyMjdWVs8xpZ7koog");Claims claims = jws.getBody();System.out.println(claims.get("id"));}}

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

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

相关文章

读数据工程之道:设计和构建健壮的数据系统03数据工程生命周期(上)

数据工程生命周期(上)1. 数据工程生命周期 1.1. 数据领域正在经历新数据技术和实践的爆炸式增长,抽象程度和易用性不断提高 1.2. 由于技术抽象程度的增加,数据工程师将越来越多地成为数据生命周期工程师,根据数据生命周期管理的原则来进行思考和操作 1.3. 数据工程生命周期…

2024年9月学习月报

一、学习目标学习 VLM 的基本原理和架构,理解视觉和语言信息的融合方式,掌握 VLM 的训练方式与评估方法。 学习 VLM 在遥感领域的应用(RemoteCLIP、ChangeCLIP),并尝试本地复现。二、学习内容 文献 An Introduction to Vision-Language Modeling VLM 按照训练方式可以分为…

31. 数据库基础

1. 数据库基础知识 1.1 关系型数据库与非关系型数据库1.2 关系型数据库的结构 库 Database 库,也称数据库,用于组织、存储和管理数据 类比于文件夹 表 Table 表,是数据库中基本的数据存储单位,由行(Row)和列(Column)组成 类比于excel文件 记录 Record 记录,是表中的一…

KeyShot基础操作2 - 材质篇

介绍了KeyShot的材质相关的内容:上材质、材质参数、贴图类型、映射类型、材质节点图等。​这部分基础操作,只是介绍KeyShot的操作方法,望知晓。 后续也会再更新材质、打光的案例,同时也会提供对应的工程文件。上材质基础操作 材质的通用参数 材质类型 纹理类型 多层材质 贴…

创建进程,设计信号量同步机制,实现多线程同步 - C语言版

环境:Windows11 编译器:Visual Studio 2019相关头文件: #include <windows.h> #include <stdio.h>相关函数:睡眠等待函数:Sleep(int millisecond); 睡眠等待一定时间,会造成OS重新调度其它的线程运行Sleep(10); //当前线程睡眠10毫秒后重新执行创建进程Cre…

Serilog文档翻译系列(七) - 应用设置、调试和诊断、开发接收器

Serilog支持通过App.config和Web.config中的01、应用设置 Serilog 支持在 App.config 和 Web.config 文件中使用简单的 配置语法,以设置最低日志级别、为事件添加额外属性以及控制日志输出。 Serilog 主要通过代码进行配置,设置支持旨在作为补充功能。虽然不是全面的,但大多…

古典+ezRSA

​ 古典密码在线工具:https://ctf.bugku.com/tools.html 一键解码工具库:随波逐流,在github上下载即可 注:古典密码只需做个了解,因为很多都是靠工具实现的,多刷题有个印象,遇到题能看出像什么密码就好。 Base家族 在密码学领域,"base" 通常指的是一种编码方…

【视频讲解】Python量子计算聚类Q-means:量子k-means算法分析电路数据实现可视化

全文链接:https://tecdat.cn/?p=37821 原文出处:拓端数据部落公众号 分析师:Yifan Zhang 量子计算在近期已然成为一个频繁出现的热门概念。尽管它在大众认知以及互联网社区中备受瞩目,热度极高,然而就其实际能力而言,当前仍然存在诸多局限。 量子计算作为一个全新的领域…