Java 实现 JWT 使用

2022-12-11  本文已影响0人  一滴矿泉水

引入 MAVN 依赖

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-api</artifactId>
  <version>0.10.7</version>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-impl</artifactId>
  <version>0.10.7</version>
  <scope>runtime</scope>
</dependency>
<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt-jackson</artifactId>
  <version>0.10.7</version>
  <scope>runtime</scope>
</dependency>

使用 (生成 与 解析)

public static void testJJwt(){
    // 生成密钥
    String key = "0123456789_0123456789_0123456789";
    SecretKey secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());

    // 1. 生成 token
    String token = Jwts.builder()          // 创建 JWT 对象
            .setSubject("JSON Web Token")  // 设置主题(声明信息)
            .signWith(secretKey)           // 设置安全密钥(生成签名所需的密钥和算法)
            .compact(); // 生成token(1.编码 Header 和 Payload 2.生成签名 3.拼接字符串)

    System.out.println(token);

    // 2. 验证token,如果验证token失败则会抛出异常
    try {
        Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token);
        // OK, we can trust this token
        System.out.println("验证成功");
    } catch (JwtException e) {
        //don't trust the token!
        System.out.println("验证失败");
    }

    // 3. 解析token
    Claims body = Jwts.parser()         // 创建解析对象
            .setSigningKey(secretKey)   // 设置安全密钥(生成签名所需的密钥和算法)
            .parseClaimsJws(token)      // 解析token
            .getBody();                 // 获取 payload 部分内容
    System.out.println(body);
}

日志输出

生成token -- :eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKU09OIFdlYiBUb2tlbiJ9.QwmY_0qXW4BhAHcDpxz62v3xqkFYbg5lsZQhM2t-kVs
验证成功
解析数据 -- :{sub=JSON Web Token}

封装 JWT 工具类

package org.example.jjwt;

import io.jsonwebtoken.*;

import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
import java.util.Map;
import java.util.UUID;

/**
 * @Description:
 * @Author: zhanghua
 * @DateTime: Created in 2022/12/12 1:22 PM 星期一
 */
public class JwtUtils {

    /**
     * key(按照签名算法的字节长度设置key)
     */
    private final static String SECRET_KEY = "0123456789_0123456789_0123456789";
/**
 * 过期时间(毫秒单位)
 */
private final static long TOKEN_EXPIRE_MILLIS = 1000 * 60 * 60;

/**
 * 创建token
 * @param claimMap
 * @return
 */
public static String createToken(Map<String, Object> claimMap) {
    long currentTimeMillis = System.currentTimeMillis();
    return Jwts.builder()
            .setId(UUID.randomUUID().toString())
            .setIssuedAt(new Date(currentTimeMillis))    // 设置签发时间
            .setExpiration(new Date(currentTimeMillis + TOKEN_EXPIRE_MILLIS))   // 设置过期时间
            .addClaims(claimMap)
            .signWith(generateKey())
            .compact();
}

/**
 * 验证token
 * @param token
 * @return 0 验证成功,1、2、3、4 验证失败
 */
public static int verifyToken(String token) {
    try {
        Jwts.parser().setSigningKey(generateKey()).parseClaimsJws(token);
        return 0;
    } catch (ExpiredJwtException e) { // 过期JWT异常
        e.printStackTrace();
        return 1;
    } catch (UnsupportedJwtException e) { // 不支持JWT异常
        e.printStackTrace();
        return 2;
    } catch (MalformedJwtException e) { // 格式不正确的JWT
        e.printStackTrace();
        return 3;
    }  catch (IllegalArgumentException e) { // 非法数据异常
        e.printStackTrace();
        return 4;
    }
}

/**
 * 解析token
 * @param token
 * @return
 */
public static Claims parseToken(String token) {
    return Jwts.parser()  // 得到DefaultJwtParser
            .setSigningKey(generateKey()) // 设置签名密钥
            .parseClaimsJws(token)
            .getBody();
}
/**
 * 生成安全密钥
 * @return
 */
public static Key generateKey() {
    return new SecretKeySpec(SECRET_KEY.getBytes(), SignatureAlgorithm.HS256.getJcaName());
}

}

调用

// token包含数据
Map<String, Object> map = new HashMap<>();
map.put("content","hello,world");

// 创建token
String token = JwtUtils.createToken(map);
System.out.println("token --- :" + token);

// 验证状态
int jwt = JwtUtils.verifyToken(token);
System.out.println("校验结果 --- :" + jwt);

// 数据解析
Claims claimMap = JwtUtils.parseToken(token);
System.out.println("解析数据 --- :" + claimMap);

日志输出

token --- :eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3NGJmOTJmNS02MDNiLTQwMGUtYjA1OC00M2E0ZmI5ZDgzYmUiLCJpYXQiOjE2NzA4MjU3OTgsImV4cCI6MTY3MDgyOTM5OCwiY29udGVudCI6ImhlbGxv77yMd29ybGQifQ.OCIc4rZijohLfXwxxKnuSv80GCjJPo_VfJWTmJ-OUC0
校验结果 --- :0
解析数据 --- :{jti=74bf92f5-603b-400e-b058-43a4fb9d83be, iat=1670825798, exp=1670829398, content=hello,world}

文章借鉴转载链接:https://www.jianshu.com/p/344a3d5bbab6

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

上一篇下一篇

猜你喜欢

热点阅读