java使用JWT的方法

 更新时间:2022年06月06日 14:40:40   作者:什么都干的派森  
这篇文章主要介绍了java使用JWT的方法,JWT是token的一种,一个JWT字符串包含三个部分分别是Header、Payload和Signature,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下

一、简介

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.jb51.net/article/250529.htm

到此这篇关于java使用JWT的文章就介绍到这了,更多相关java使用JWT内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis-plus批处理IService的实现示例

    mybatis-plus批处理IService的实现示例

    这篇文章主要介绍了mybatis-plus批处理IService的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 解读HttpServletRequestWrapper处理request数据流多次读取问题

    解读HttpServletRequestWrapper处理request数据流多次读取问题

    在Java Web开发中,获取HTTP请求参数是常见需求,本文详细讨论了通过POST方式获取参数的两种主要方法:使用request.getParameter()适用于application/x-www-form-urlencoded和multipart/form-data内容类型;而对于application/json类型的数据
    2024-10-10
  • Java实现短信验证码功能的完整代码

    Java实现短信验证码功能的完整代码

    这篇文章主要为大家详细介绍了Java实现短信验证码功能的完整代码,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2025-12-12
  • java实现动态代理示例分享

    java实现动态代理示例分享

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程。
    2014-03-03
  • Java静态方法不能调用非静态成员的原因分析

    Java静态方法不能调用非静态成员的原因分析

    在Java中,静态方法是属于类的方法,而不是属于对象的方法,它可以通过类名直接调用,无需创建对象实例,非静态成员指的是类的实例变量和实例方法,它们需要通过对象实例才能访问和调用,本文小编将和大家一起探讨Java静态方法为什么不能调用非静态成员
    2023-10-10
  • Spring Service功能作用详细讲解

    Spring Service功能作用详细讲解

    service层测试较简单,目前大多数测试主要是针对public方法进行的。依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试
    2022-12-12
  • 利用Spring插件实现策略模式的案例详解

    利用Spring插件实现策略模式的案例详解

    Spring插件提供了一种更实用的插件开发方法,它提供了插件实现扩展核心系统功能的核心灵活性,但当然不提供核心OSGi功能,如动态类加载或运行时安装和部署插件,本文就来聊下如何使用spring插件来实现策略模式,需要的朋友可以参考下
    2023-05-05
  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA实现持久化存储数据到数据库的示例代码

    Spring Data JPA是Spring基于JPA规范的基础上封装的⼀套 JPA 应⽤框架,可使开发者⽤极简的代码即可实现对数据库的访问和操作。本文我们来了解如何用Spring Data JPA框架实现数据持久化存储到数据库,感兴趣的可以了解一下
    2022-04-04
  • Java使用jxl库轻松玩转Excel表操作

    Java使用jxl库轻松玩转Excel表操作

    jxl 是一个非常实用的 Java 库,专门用于操作 Excel 表格,这篇文章主要为大家介绍了如何使用jxl进行Excel的基本操作,有需要的可以了解下
    2025-02-02
  • Maven构建生命周期详细介绍

    Maven构建生命周期详细介绍

    这篇文章主要介绍了Maven构建生命周期详细介绍,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下。
    2017-11-11

最新评论