信息发布→ 登录 注册 退出

java使用JWT的方法

发布时间:2026-01-11

点击量:
目录
  • 一、简介
    • 1.Header
    • 2.Payload
    • 3.Signature
    • 4.组合
  • 二、封装类
    • 1.引入依赖
    • 2.封装方法
  • 三、使用方法

    一、简介

    JWT是token的一种,一个JWT字符串包含三个部分

    1.Header

    头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型

    {
      "alg": "HS256",    // 指定签名算法
      "typ": "JWT"		 // 指定token令牌类型
    }

    2.Payload

    包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息

    iss: 发行人
    exp: 到期时间
    sub: 主题
    aud: 用户
    nbf: 在此之前不可用
    iat: 发布时间
    jti: JWT ID用于标识该JWT

    3.Signature

    数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】

    iss: 发行人
    exp: 到期时间
    sub: 主题
    aud: 用户
    nbf: 在此之前不可用
    iat: 发布时间
    jti: JWT ID用于标识该JWT
    

    4.组合

    最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT

    Header.Payload.Signature

    二、封装类

    1.引入依赖

    <!-- jwt -->
    <dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.10.3</version>
    </dependency>

    2.封装方法

    package com.cxstar.utils;
    import com.auth0.jwt.JWT;
    import com.auth0.jwt.JWTCreator;
    import com.auth0.jwt.algorithms.Algorithm;
    import com.auth0.jwt.interfaces.DecodedJWT;
    import com.auth0.jwt.interfaces.JWTVerifier;
    import java.util.Calendar;
    import java.util.Map;
    public class JwtUtil {
        // 签名密钥
        private static final String SECRET = "hello JWT *%$#$&";
        /**
         * 生成token
         * @param payload token携带的信息
         * @return token字符串
         */
        public static String generateToken(Map<String,String> payload){
            // 指定token过期时间
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.HOUR, 24);  // 24小时
            JWTCreator.Builder builder = JWT.create();
            // 构建payload
            payload.forEach(builder::withClaim);
            // 指定过期时间和签名算法,并返回token
            String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));
            return token;
        }
    
        /**
         * 解析token
         * @param token token字符串
         * @return 解析后的token类
         */
        public static DecodedJWT decodeToken(String token){
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            return decodedJWT;
        }
    }
    

    三、使用方法

    package com.cxstar;
    import com.auth0.jwt.exceptions.JWTDecodeException;
    import com.auth0.jwt.exceptions.TokenExpiredException;
    import com.auth0.jwt.interfaces.DecodedJWT;
    import com.cxstar.utils.JwtUtil;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    import java.util.HashMap;
    import java.util.Map;
    @SpringBootTest
    class JwtLoginApplicationTests {
        @Test
        void tokenTest() {
            // 根据用户信息生成令牌 --------------------------
            Map<String, String> payload = new HashMap<>();
            payload.put("userId", "233");
            payload.put("userName", "ps");
            String token = JwtUtil.generateToken(payload);
            System.out.println("token: " + token);
            // --------------------------------------------
            // 解析令牌并获取用户信息 ------------------------------------------------
            try {
                DecodedJWT decodedJWT = JwtUtil.decodeToken(token);
                String userId = decodedJWT.getClaim("userId").asString();
                String userName = decodedJWT.getClaim("userName").asString();
                String exp = decodedJWT.getExpiresAt().toString();
                System.out.println("userId: " + userId);      // 取出自定义属性【用户id】
                System.out.println("userName: " + userName);  // 取出自定义属性【用户名】
                System.out.println("exp: " + exp);            // 取出默认属性【过期时间】
            } catch (JWTDecodeException e) {
                System.out.println("令牌错误");
            } catch (TokenExpiredException e) {
                System.out.println("令牌过期");
            }
            // -------------------------------------------------------------------
        }
    
    }
    

    ps:最后附一篇写的很详细的JWT文章https://www./article/250529.htm

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!