jjwt使用说明-笔记

jjwt官网链接:https://github.com/jwtk/jjwt

POM 依赖

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.12.3</version>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-impl</artifactId>
  <version>0.12.3</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
  <version>0.12.3</version>
  <scope>runtime</scope>
</dependency>
<!-- Uncomment this next dependency if you are using:
- JDK 10 or earlier, and you want to use RSASSA-PSS (PS256, PS384, PS512) signature algorithms.  
- JDK 10 or earlier, and you want to use EdECDH (X25519 or X448) Elliptic Curve Diffie-Hellman encryption.
- JDK 14 or earlier, and you want to use EdDSA (Ed25519 or Ed448) Elliptic Curve signature algorithms.    
It is unnecessary for these algorithms on JDK 15 or later.
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId> or bcprov-jdk15to18 on JDK 7
<version>1.76</version>
<scope>runtime</scope>
</dependency>
-->

生成token

PS: 基本和java-jwt使用一致。只是最新的jjwt舍弃了一些api,换了新的api

① 标准载荷:
JwtBuilder为JWT规范中定义的标准载荷提供了方便的构建器方法。
● issuer: sets the iss(Issuer) Claim jwt签发者
● subject: sets the sub(Subject) Claim jwt针对的用户
● audience: sets the aud(Audience) Claim 校验jwt的一方
● expiration: sets the exp(Expiration Time) Claim jwt过期时间
● notBefore: sets the nbf(Not Before) Claim 定义在某个时间前该jwt是不可用的
● issuedAt: sets the iat(Issued At) Claim 签发时间
● id: sets the jti(JWT ID) Claim jwt的唯一身份标识,作一次性token,防重放攻击。
② 自定义载荷:
● claime(key,value)
● claime(Map对象)

// 创建token密钥的key,并且使用 HMAC-SHA-256 加密算法
private static SecretKey key = Jwts.SIG.HS256.key().build();

/**
 * 生成token
 * @return
 */
public static String genToken(){
    // 2. 构建jwt,将签发人设置为joe,并且使用密钥将签名jwt生成为jws
    String jws =  Jwts.builder().
            subject("Joe").  // setSubject 设置jwt针对的用户
            issuer("张三").   // issuer 签发人
            claim("name","zhangsan"). // 自定义载荷数据
            claim("role","admin"). // 自定义载荷数据
            signWith(key).   // token加签认证
            expiration(new Date(System.currentTimeMillis()+7200*1000)). // 设置token过期时间为2H
            compact();  // 生成token字符串
    return jws;
}

生成token的两句核心代码:

SecretKey key = Jwts.SIG.HS256.key().build();
Jwts.builder().setSubject("Joe").signWith(key).compact();

验证解析token

 /**
 * token 校验
 * @param key  密钥
 * @param token jws
 * @return
 */
public static String checkToken(SecretKey key,String token ){
    String msg = null;
    try {
        Jws<Claims> claimsJws = Jwts.parser().
                verifyWith(key).
                build().
                parseSignedClaims(token);
        // 获取载荷的一些数据信息
        Claims payload = claimsJws.getPayload(); // payload 为一个map对象
        String issuer = payload.getIssuer();
        Date expiration = payload.getExpiration();
        String name = (String)payload.get("name");
        String role = (String)payload.get("role");
        // 测试就直接打印出去了...
        System.out.println("标准载荷:issuer===>"+issuer+"\texpiration=>"+expiration + "自定义载荷数据:"+name+"\t"+role);
        return "token正确";
    } catch (SignatureException se) {
        msg = "密钥错误";
        return  msg;
    }catch (MalformedJwtException me) {
        msg = "密钥算法或者密钥转换错误";
        return  msg;
    }catch (MissingClaimException mce) {
        msg = "密钥缺少校验数据";
        return  msg;
    }catch (ExpiredJwtException mce) {
        msg = "密钥已过期";
        return  msg;
    }catch (JwtException jwte) {
        msg = "密钥解析错误";
        return  msg;
    }
}

完整代码

package jwt_test;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.SignatureException;
import javax.crypto.SecretKey;
import java.util.Date;

/**
 * jjwt
 */
public class JJwtUtils {

    // 创建token密钥的key,并且使用 HMAC-SHA-256 加密算法
    private static SecretKey key = Jwts.SIG.HS256.key().build();

    /**
     * 生成token
     * @return
     */
    public static String genToken(){
        // 2. 构建jwt,将签发人设置为joe,并且使用密钥将签名jwt生成为jws
        String jws =  Jwts.builder().
                subject("Joe").  // setSubject 设置jwt针对的用户
                issuer("张三").   // issuer 签发人
                claim("name","zhangsan"). // 自定义载荷数据
                claim("role","admin"). // 自定义载荷数据
                signWith(key).   // token加签认证
                expiration(new Date(System.currentTimeMillis()+7200*1000)). // 设置token过期时间为2H
                compact();  // 生成token字符串
        return jws;
    }

    /**
     * token 校验
     * @param key  密钥
     * @param token jws
     * @return
     */
    public static String checkToken(SecretKey key,String token ){
        String msg = null;
        try {
            Jws<Claims> claimsJws = Jwts.parser().
                    verifyWith(key).
                    build().
                    parseSignedClaims(token);
            // 获取载荷的一些数据信息
            Claims payload = claimsJws.getPayload(); // payload 为一个map对象
            String issuer = payload.getIssuer();
            Date expiration = payload.getExpiration();
            String name = (String)payload.get("name");
            String role = (String)payload.get("role");
            // 测试就直接打印出去了...
            System.out.println("标准载荷:issuer===>"+issuer+"\texpiration=>"+expiration + "自定义载荷数据:"+name+"\t"+role);
            return "token正确";
        } catch (SignatureException se) {
            msg = "密钥错误";
            return  msg;
        }catch (MalformedJwtException me) {
            msg = "密钥算法或者密钥转换错误";
            return  msg;
        }catch (MissingClaimException mce) {
            msg = "密钥缺少校验数据";
            return  msg;
        }catch (ExpiredJwtException mce) {
            msg = "密钥已过期";
            return  msg;
        }catch (JwtException jwte) {
            msg = "密钥解析错误";
            return  msg;
        }
    }


    /**
    * 	测试
    */
    public static void main(String[] args) {
        String token = genToken();
        System.out.println(token);
        // 断言测试
        // assert Jwts.parser().verifyWith(key).build().parseSignedClaims(token).getPayload().getSubject().equals("Joe");
        String res = checkToken(key, token);
        System.out.println(res);
    }

}

在这里插入图片描述

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

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

相关文章

Web前端—移动Web第五天(媒体查询、Bootstrap、综合案例-alloyTeam)

版本说明 当前版本号[20231122]。 版本修改说明20231122初版 目录 文章目录 版本说明目录移动 Web 第五天01-媒体查询基本写法书写顺序案例-左侧隐藏媒体查询-完整写法关键词 / 逻辑操作符媒体类型媒体特性 媒体查询-外部CSS 02-Bootstrap简介使用步骤下载使用 栅格系统全局…

易点易动库存管理系统革新企业库存管理,降本增效

随着全球经济的快速发展和市场竞争的加剧&#xff0c;企业对库存管理的需求变得越来越迫切。传统的手工操作和繁琐的库存管理方式已经无法满足现代企业的需求。为了解决这一问题&#xff0c;易点易动库存管理系统应运而生。 易点易动库存管理系统概述 易点易动库存管理系统是一…

快速上手Banana Pi BPI-M4 Zero 全志科技H618开源硬件开发开发板

Linux[编辑] 准备[编辑] 1. Linux镜像支持SD卡或EMMC启动&#xff0c;并且会优先从SD卡启动。 2. 建议使用A1级卡&#xff0c;至少8GB。 3. 如果您想从 SD 卡启动&#xff0c;请确保可启动 EMMC 已格式化。 4. 如果您想从 EMMC 启动并使用 Sdcard 作为存储&#xff0c;请确…

220V转12V固定输出12V非隔离芯片WT5106WT5105

220V转12V固定输出12V非隔离芯片WT5106WT5105 今天给大家介绍一款实用芯片&#xff0c;WT5106。它是一款高效率高精度的非隔离降压开关电源恒压控制驱动芯片。 WT5106适用于85VAC~265VAC全范围输入电压的非隔离Buck、Buckboost拓扑结构&#xff0c;小家电、电机驱动、继电器驱…

分布式篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、分布式幂等性如何设计?二、简单一次完整的 HTTP 请求所经历的步骤?三、说说你对分布式事务的了解前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

【HarmonyOS】 API9 Stage模型 MD5加密字符串

在API9 Stage 模型中使用MD5加密&#xff0c;使用ohpm的三方库"ohos/crypto-js"进行加密操作 【集成步骤】 1、在entry-oh-package.json5中添加"ohos/crypto-js"依赖&#xff0c;点击sync同步依赖&#xff0c;crypto-js最新版本是2.0.2只支持API10&#x…

字符串和内存函数(2)

文章目录 2.13 memcpy2.14 memmove2.15 memcmp2.16 memset 2.13 memcpy void* memcpy(void* destination, const void* source, size_t num); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 ‘\0’ 的时候并不会停下来。如果so…

永久免费!N个excel表一键合并成一个表(excel表格合并技巧)

您是否还在用手工复制粘贴来将多个EXCEL或表的数据合并到一个表里&#xff1f;那就太麻烦&#xff0c;效率太低了&#xff0c;用金鸣表格文字识别的“表格合并”功能&#xff0c;可免费将N个excel文件或N个excel表一键合并到一个表里面&#xff0c;而且这个功能永久免费&#x…

ubuntu22.04安装网易云音乐

附件&#xff1a; https://download.csdn.net/download/weixin_44503976/88557248 wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb wget -O patch.c https://aur.archlinux.org/cgit/aur.git/plain/patch.c?hnetease-cloud-m…

山西电力市场日前价格预测【2023-11-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-24&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为685.26元/MWh&#xff0c;预计出现在18:00。最低日前电价为296.84元/MWh&#xff0c;预计…

重磅!2023年两院院士增选名单公布

中国科学院 关于公布2023年中国科学院院士增选当选院士名单的公告 根据《中国科学院院士章程》《中国科学院院士增选工作实施办法&#xff08;试行&#xff09;》等规定&#xff0c;2023年中国科学院选举产生了59名中国科学院院士。 现予公布。 中国科学院 2023年11月22日…

内衣洗衣机哪些品牌质量好实惠?小型洗衣机全自动

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

Altium Designer学习笔记10

再次根据图纸进行布局走线&#xff1a; 这个MT2492 建议的布局走线。 那我这边应该是尽量按照该图进行布局&#xff1a; 其中我看到C1的电容的封装使用的是电感的封装&#xff0c;需要进行更换处理&#xff1a; 执行Validate Changes和Execute Changes操作&#xff0c;更新&a…

11月23日星期四今日早报简报微语报早读

11月23日星期四&#xff0c;农历十月十一&#xff0c;早报微语早读。 1、我国5G基站总数达321.5万个&#xff1b; 2、2023年两院院士增选结果揭晓&#xff0c;共133人当选&#xff1b; 3、北京低保标准提升至每人每月1395元&#xff1b; 4、上海制定体育发展条例&#xff1a…

C++数组中重复的数字

3. 数组中重复的数字 题目链接 牛客网 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 Input: {2, 3, 1, 0, 2, 5}Output: 2解题…

Postgres 数据库中 ULID 和 UUID 的性能

大家好&#xff01;在本文中&#xff0c;我想分享我对经常用作标识符的数据类型的知识和看法。今天我们将同时讨论两个主题。这些是数据库端按键和键的数据类型衡量的搜索速度。 我将使用PostgreSQL数据库和演示Java服务来比较查询速度。 UUID 和 ULID 为什么我们需要某种难…

【Java工具篇】Java反编译工具Bytecode Viewer

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

解决 requests 库上传大文件速度慢的问题:从问题原因到解决方案

在我的加班日志里&#xff0c;经常会有一些日期和事件&#xff0c;这次我要写的是2023-03-24&#xff0c;当时的事件是追bug。 我遇到了一个困扰已久的问题&#xff0c;就是requests库上传大文件的速度非常慢。这个问题让我很头疼&#xff0c;因为我正在处理一个需要大量上传文…

浅谈JDK动态代理(中)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 动态代理的使命 在做日…

如何用CHAT解释文章含义?

问CHAT&#xff1a;解释“ 本身乐善好施&#xff0c;令名远近共钦&#xff0c;待等二十左右&#xff0c;定有高亲可攀&#xff1b;而且四德俱备&#xff0c;帮夫之缘亦有。主持家事不紊&#xff0c;上下亦无闲言。但四十交进&#xff0c;家内谨防口舌&#xff0c;须安家堂&…