JWT的简单使用

博客主要介绍了JWT的简单使用,包括引入JWT依赖、生成令牌、验证对象等内容,还提及了JWTUtils简单工具类,为Java开发中使用JWT提供了基础操作指引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JWT的简单使用

1. 引入JWT依赖

<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.19.2</version>
</dependency>

2. JWT生成令牌

@Test
void testJWT() {
    Map<String, Object> map = new HashMap<>();
    Calendar instance = Calendar.getInstance();
    //添加过期时间,这里是两分钟后过期;
    instance.add(Calendar.SECOND, 120);
    // 生成令牌
    String token = JWT.create()
            .withHeader(map) 	// header:一般不进行更改,默认值为 HS256 和 JWT
            .withClaim("userId", 21)    //payload:可以添加多个数据
            .withClaim("username", "xiaohei")
            .withExpiresAt(instance.getTime())  	//指定令牌过期时间
            .sign(Algorithm.HMAC256("!FDYGEYR$&"));    //签名:选择使用算法和使用密钥

    System.out.println(token);
}

生成令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJleHAiOjE2NjA1MjYzNDYsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb2hlaSJ9
.IcE_KOp6xUVgpfuERR75OwdqamiuXbMBlhVYaAg6BMA

3. JWT验证对象


@Test
void testJWT1() {
    // 创建验证对象
    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!FDYGEYR$&")).build();     // 选择使用算法,通过build生成JWT验证对象
    DecodedJWT decodedJWT = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" +
            ".eyJleHAiOjE2NjA1MjYzNDYsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb2hlaSJ9" +
            ".IcE_KOp6xUVgpfuERR75OwdqamiuXbMBlhVYaAg6BMA");                    //使用JWT验证对象验证token
    System.out.println("header:" + decodedJWT.getHeader());                     // 得到token中的header
    System.out.println("payload:" + decodedJWT.getPayload());                   // 得到token中的payload
    System.out.println("signature:" + decodedJWT.getSignature());               // 得到token中的signature
    System.out.println("token:" + decodedJWT.getToken());                       // 得到整个token
    System.out.println("userId:" + decodedJWT.getClaim("userId"));           // 通过 key 得到 payload 中的信息
    System.out.println("username:" + decodedJWT.getClaim("username"));
    System.out.println("payload中封装的数据:" + decodedJWT.getClaims());          // 得到 payload 中的所有信息
    System.out.println("过期时间ExpireAt:" + decodedJWT.getExpiresAt());         // 得到过期时间
}

图示:
在这里插入图片描述

4. JWTUtils简单工具类

package com.example.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class JWTUtils {
    /**
     * 签名,由于生成token和解签时都需要使用sign,所以作为成员变量。
     */
    private static final String SIGN = "$%!FDGS^@G!GF!AFDSF&%^F";

    private JWTUtils() {
    }

    /**
     * 生成token      header.payload.signature
     * @param map 用户信息,以 Map<String, String> 类型封装
     * @return token字符串
     */
    public static String getToken(Map<String, String> map) {
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE, 7);     // 默认7天过期

        //创建 JWTBuilder
        JWTCreator.Builder builder = JWT.create();

        //header不写则使用默认值

        // payload
        map.forEach((k, v) -> {
            builder.withClaim(k, v);
        });

        String token = builder
                .withExpiresAt(instance.getTime())      //过期时间
                .sign(Algorithm.HMAC256(SIGN));         //签名算法

        return token;
    }

    /**
     * 验证token是否合法,若不合法则会抛出异常
     * @param token token字符串
     */
    public static void verifyToken(String token) {
        JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
    }

    /**
     * 获取token的信息,通过调用 DecodedJWT 的 get 方法,可以得到 token 的各种信息
     * 该方法也可以和验证 token 方法合并
     * @param token token字符串
     * @return DecodedJWT
     */
    public static DecodedJWT getTokenInfo(String token) {
        return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值