Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java jwt生成token


在 Java 中生成 JWT(JSON Web Token)有几种不同的方式。JWT 是一种用于安全传输信息的开放标准,通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。下面我将介绍两种常见的生成 JWT 的方式,并提供相应的示例代码。

方式一:使用 Java 内置库

Java 内置了 Base64 编码和 HMAC 算法,可以使用这些功能来生成 JWT。以下是生成 JWT 的步骤:

  1. 构建头部(Header): 创建一个 JSON 对象,包含算法和类型信息。
  2. 构建载荷(Payload): 创建一个 JSON 对象,包含要传输的信息,如用户 ID、过期时间等。
  3. 编码头部和载荷: 使用 Base64 编码将头部和载荷转换为字符串。
  4. 生成签名: 将编码后的头部、载荷和密钥传递给 HMAC 算法,生成签名。
  5. 合并: 将编码后的头部、载荷和签名用点号连接起来,形成 JWT。

下面是一个示例代码:

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtGenerator {

    private static String generateToken(Map<String, Object> claims, String secretKey) {
        // 构建头部
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");

        // 构建载荷
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        claims.put("iat", now);
        // 设置过期时间为一小时后
        claims.put("exp", new Date(nowMillis + 3600000));

        // 编码头部和载荷
        String encodedHeader = Base64.getUrlEncoder().encodeToString(header.toString().getBytes());
        String encodedClaims = Base64.getUrlEncoder().encodeToString(claims.toString().getBytes());

        try {
            // 生成签名
            Mac sha256Hmac = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
            sha256Hmac.init(secretKeySpec);
            String signature = Base64.getUrlEncoder().withoutPadding().encodeToString(sha256Hmac.doFinal((encodedHeader + "." + encodedClaims).getBytes()));

            // 合并为JWT
            return encodedHeader + "." + encodedClaims + "." + signature;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", "12345");

        String secretKey = "your-secret-key";
        String token = generateToken(claims, secretKey);
        System.out.println("Generated JWT: " + token);
    }
}

方式二:使用第三方库(jjwt 库)

JSON Web Token (JWT)库是一个流行的第三方库,它简化了 JWT 的创建和验证过程。这里使用 jjwt 库进行示例演示。

添加依赖: 在 Maven 或 Gradle 项目的构建文件中,添加 jjwt 依赖。

  • Maven:
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.2</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>
  • Gradle:
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'

生成 JWT: 使用 jjwt 库创建一个 Jwts.builder,并设置相关信息。

下面是一个示例代码:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtGenerator {

    private static String generateToken(Map<String, Object> claims, String secretKey) {
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        return Jwts.builder()
            .setClaims(claims)
            .setIssuedAt(now)
            .setExpiration(new Date(nowMillis + 3600000)) // 1 hour
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
    }

    public static void main(String[] args) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", "12345");

        String secretKey = "your-secret-key";
        String token = generateToken(claims, secretKey);
        System.out.println("Generated JWT: " + token);
    }
}

请注意,示例代码中的 "your-secret-key" 应该替换为您实际使用的密钥。此外,这两种方法都有安全性考虑,您应该在生产环境中使用适当的安全措施来管理密钥和令牌的生成。

在Java中刷新JWT(JSONWebToken)令牌,可以使用不同的实现方式。令牌刷新请求:在令牌即将过期时,客户端发送一个令牌刷新请求, ...
在Java中实现JWT(JSONWebToken)单点登录有多种方式,以下是其中一些常见的实现方式以及它们的步骤流程、依赖坐标和示例代码。# ...
在Java中生成文件有多种方式,以下是一些常见的实现方式,以及每种方式的详细步骤流程和示例代码。创建一个`BufferedOutputStr ...
在Java中生成PDF有多种方式,其中一些常见的方法包括使用第三方库、使用Java自带的库、以及使用HTML/CSS转换工具。###步骤流程 ...
在Java中生成PDF可以通过多种方式实现,这里我将介绍两种常用的方法:使用iText和ApachePDFBox这两个流行的Java第三方库 ...