jjwt使用说明-笔记

简介: 这篇文章介绍了如何使用jjwt库在Java中生成和验证JSON Web Tokens (JWT)。文章提供了在Maven项目中添加jjwt依赖的步骤,生成token的方法,以及如何验证token的示例代码。此外,还包含了一些关于token标准载荷和自定义载荷的说明,以及如何处理token验证过程中可能遇到的异常。

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);
    }

}

在这里插入图片描述

相关文章
最新jsonwebtoken-jjwt 0.12.3 基本使用
最新jsonwebtoken-jjwt 0.12.3 基本使用
3711 1
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2173 5
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
11602 2
Spring Boot 3 集成 Druid 连接池详解
|
JSON 算法 安全
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。
19113 2
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
508 0
|
9月前
|
存储 安全 Java
Spring Security 入门与详解
Spring Security 是 Spring 框架中的核心安全模块,提供认证、授权及防护功能。本文详解其核心概念,包括认证(Authentication)、授权(Authorization)和过滤器链(Security Filter Chain)。同时,通过代码示例介绍基本配置,如 PasswordEncoder、UserDetailsService 和自定义登录页面等。最后总结常见问题与解决方法,助你快速掌握 Spring Security 的使用与优化。
2444 0
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
6242 13
Spring Boot 3 集成 Spring Security + JWT
|
存储 安全 前端开发
SpringBoot整合Spring Security + JWT实现用户认证
SpringBoot整合Spring Security + JWT实现用户认证的实现
7464 2
SpringBoot整合Spring Security + JWT实现用户认证
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
878 11
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
31736 0