在 Java 中生成 JWT(JSON Web Token)有几种不同的方式。JWT 是一种用于安全传输信息的开放标准,通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。下面我将介绍两种常见的生成 JWT 的方式,并提供相应的示例代码。
Java 内置了 Base64 编码和 HMAC 算法,可以使用这些功能来生成 JWT。以下是生成 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);
}
}
JSON Web Token (JWT)库是一个流行的第三方库,它简化了 JWT 的创建和验证过程。这里使用 jjwt 库进行示例演示。
添加依赖: 在 Maven 或 Gradle 项目的构建文件中,添加 jjwt 依赖。
<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>
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" 应该替换为您实际使用的密钥。此外,这两种方法都有安全性考虑,您应该在生产环境中使用适当的安全措施来管理密钥和令牌的生成。