JWT小工具

/**
 * The most handsome man.
 * User: jason.Wang
 * Date: 2020/9/23
 * Time: 22:19
 * Description:
 */

/**
 * JWT工具类
 */
public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000  一个小时
    //设置秘钥明文
    public static final String JWT_KEY = "wwwww";

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;   //默认时常一个小时
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        SecretKey secretKey = generalKey();

        JwtBuilder builder = Jwts.builder()
                .setId(id)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("admin")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);// 设置过期时间
        return builder.compact();
    }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
}
/**
 * The most handsome man.
 * User: jason.Wang
 * Date: 2020/9/23
 * Time: 22:53
 * Description:
 */

/**
 * jwt校验工具类
 */
public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000  一个小时
    //设置秘钥明文
    public static final String JWT_KEY = "wjss";

    /**
     * 生成加密后的秘钥 secretKey
     *
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

 

### JWT简易工具的使用方法 JWT(JSON Web Token)作为一种轻量级的身份验证机制,在现代Web开发中得到了广泛应用。以下是关于如何使用JWT简易工具生成和验证令牌的具体说明。 #### 1. 工具引入 为了在项目中使用JWT,首先需要导入相应的依赖库。如果是在Spring Boot环境中工作,则可以通过Maven或Gradle添加依赖项[^2]: 对于Maven项目,可以在`pom.xml`文件中加入以下内容: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 对于Gradle项目,可以添加如下代码: ```gradle implementation 'io.jsonwebtoken:jjwt:0.9.1' ``` #### 2. 生成JWT令牌 生成JWT令牌的过程主要包括设置头部信息、载荷数据以及签名计算。下面是一个简单的Java代码示例,展示如何创建一个JWT令牌[^3]: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtil { private static final String SECRET_KEY = "yourSecretKey"; // 秘钥 public static String generateToken(String subject, long ttlMillis) { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; // 使用HS256算法 // 设置头部信息 var headerClaimsSet = Jwts.header().setTyp("JWT"); // 创建payload并添加自定义声明 var claimsSetBuilder = Jwts.claims().setSubject(subject); claimsSetBuilder.addClaims(Map.of( "userId", "123", "role", "admin" )); // 构建JWT字符串 return Jwts.builder() .setHeader(headerClaimsSet) .setClaims(claimsSetBuilder.build()) .setIssuedAt(new Date()) // 发行时间 .signWith(signatureAlgorithm, SECRET_KEY.getBytes()) // 签名 .compact(); } } ``` 上述代码中的`SECRET_KEY`应替换为实际使用的密钥,而`ttlMillis`参数表示令牌的有效期(毫秒数)。此函数返回的是已编码好的JWT字符串。 #### 3. 验证JWT令牌 当接收到客户端发送过来的JWT时,服务端需对其进行解析与验证以确认其合法性。下面是验证JWT的一个例子[^4]: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jwts; public class JwtValidator { private static final String SECRET_KEY = "yourSecretKey"; public static Claims validateToken(String token) throws Exception { try { return Jwts.parser() // 解析器实例化 .requireIssuer("issuer") // 可选:指定签发方 .setSigningKey(SECRET_KEY.getBytes()) // 设置秘钥进行解码 .parseClaimsJws(token).getBody(); // 获取负载部分 } catch (ExpiredJwtException e) { // 处理过期异常 throw new RuntimeException("Token has expired."); } catch (Exception e) { throw new RuntimeException("Invalid token."); } } } ``` 在这个过程中,会检查令牌是否有效,并提取出其中包含的信息。如果有任何错误发生(比如签名不匹配或者已经超出了有效期),则抛出相应异常。 ### 注意事项 - **安全性**:切勿将敏感信息存放在JWT的Payload字段里,因为它仅经过Base64编码而非加密处理[^1]。 - **密钥管理**:确保用于签名的密钥妥善保管,防止泄露给未经授权的人士。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值