JWT工具类

JWT工具类

一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。具体内容可参考官方文档

头部(Header)头部用于描述关于该 JWT 的最基本的信息

载荷(playload)载荷就是存放有效信息的地方。

这些有效信息包含三个部分:

  • 标准中注册的声明(建议但不强制使用)
  • 公共的声明
  • 私有的声明

注意:载荷中的这3个声明并不是都要同时设置。

签证(signature)jwt的第三部分是一个签证信息。

实战入门

引入Maven依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <scope>runtime</scope>
</dependency>

创建JWT工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map; 

public class JwtUtil {  
 	private SecretKey tokenSignKey = Keys.hmacShaKeyFor("your_secret_key".getBytes()); // JWT加密或解密的秘钥 
    
    private String secretKey = "your_secret_key"; // JWT加密或解密的秘钥  
    private long expirationTime = 1000 * 60 * 60; // 1小时过期时间  
    
    // 生成JWT  
    public String generateToken(String id) {  
        Map<String, Object> claims = new HashMap<>();  
        return createToken(claims, id);  
    }  

    private String createToken(Map<String, Object> claims, String subject) {  
        return Jwts.builder()  
                .setClaims(claims)   // 载荷-标准中注册的声明
                .setSubject(subject) //设置主题 
                .setIssuedAt(new Date(System.currentTimeMillis()))  //设置 JWT 的签发时间为当前时间
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime))   //设置过期时间
                .signWith(SignatureAlgorithm.HS256, secretKey) //使用指定的签名算法(这里是 HS256)和密钥(secretKey)对 JWT 进行签名
                .compressWith(CompressionCodecs.GZIP) //使用 GZIP 压缩 JWT,以减少其大小,便于传输。
                .compact();  //构建和返回
    }  

    // 验证JWT  
    public boolean validateToken(String token, String id) {  
        final String extractId = extractId(token);  
        return (extractId.equals(id) && !isTokenExpired(token));  
    }  

    // 从JWT中提取用户Id  
    public String extractId(String token) {  
        return extractAllClaims(token).getSubject();  
    }  

    // 检查JWT是否过期  
    public boolean isTokenExpired(String token) {  
        return extractAllClaims(token).getExpiration().before(new Date());  
    }  

    // 提取所有声明  
    private Claims extractAllClaims(String token) {  
        return Jwts.parser()  
                .setSigningKey(secretKey)  
                .parseClaimsJws(token)  
                .getBody();  
    }  
}

使用示例

public class Main {  
    public static void main(String[] args) {  
        JwtUtil jwtUtil = new JwtUtil();  
        
        // 生成token  
        String token = jwtUtil.generateToken("username123");  
        System.out.println("Generated Token: " + token);  
        
        // 验证token  
        boolean isValid = jwtUtil.validateToken(token, "username123");  
        System.out.println("Is token valid? " + isValid);  
    }  
}

注意事项

  • 安全性:请务必使用强随机密钥,并避免使用简单的字符串作为密钥。
  • 过期时间:根据您的应用需求合理设置 JWT 的过期时间。
  • Claims:您可以根据需求添加其他用户相关的 Claims。
posted @ 2024-11-05 21:17  CH_song  阅读(568)  评论(0)    收藏  举报