jjwt使用制作token,解析token异常提醒

本文介绍了如何在SpringBoot项目中使用JWT进行安全令牌的生成、配置和解析,包括密钥、header、有效期和异常处理等内容。
摘要由CSDN通过智能技术生成
<!-- jwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<jjwt.version>0.9.1</jjwt.version>

yml配置文件

# JWT配置
jwt:
  # 密匙Key
  token-secret: WangKun
  # HeaderKey
  token-header-key: Authorization
  # Token前缀
  token-prefix: WangKun
  # 过期时间,单位秒
  token-expiration: 864000

获取token信息

/**
 * @Description JWT令牌信息
 * @Author WangKun
 * @Date 2024/1/30 18:24
 * @Version
 */
@Data
@Component
public class JwtInfoConfig {

    /**
     * token响应头Key
     */
    public static String tokenHeaderKey;

    /**
     * token前缀
     */
    public static String tokenPrefix;

    /**
     * token秘钥
     */
    public static String tokenSecret;

    /**
     * token过期时间
     */
    public static Long tokenExpiration;


    @Value("${jwt.token-header-key}")
    public void setTokenHeaderKey(String tokenHeaderKey) {
        JwtInfoConfig.tokenHeaderKey = tokenHeaderKey;
    }

    @Value("${jwt.token-prefix}")
    public void setTokenPrefix(String tokenPrefix) {
        JwtInfoConfig.tokenPrefix = tokenPrefix;
    }

    @Value("${jwt.token-secret}")
    public void setTokenSecret(String tokenSecret) {
        JwtInfoConfig.tokenSecret = tokenSecret;
    }

    @Value("${jwt.token-expiration}")
    public void setTokenExpiration(Long tokenExpiration) {
        JwtInfoConfig.tokenExpiration = tokenExpiration;
    }
}

制作token

/**
 * @Description Token令牌工具
 * @Author WangKun
 * @Date 2024/2/1 15:33
 * @Version
 */
@Slf4j
public class TokenUtil {


    /**
     * @param username   用户名
     * @param claimKey   有效负荷key(不加密,不要放隐私内容)
     * @param claimValue 有效负荷value
     * @Description 生成令牌
     * @Throws
     * @Return java.lang.String
     * @Date 2024-02-01 16:10:49
     * @Author WangKun
     */
    public static String creatToken(String username, String claimKey, Object claimValue) {
        //有效负荷
        Claims claim = Jwts.claims();
        claim.put(claimKey, claimValue);
        //设置token响应头
        return Jwts.builder()
                //设置有效负荷
                .setClaims(claim)
                //设置用户名
                .setSubject(username)
                //设置token过期时间
                .setExpiration(new Date(System.currentTimeMillis() + JwtInfoConfig.tokenExpiration))
                //设置token签名算法及秘钥
                .signWith(SignatureAlgorithm.HS512, JwtInfoConfig.tokenSecret).compact();
    }

    /**
     * @param username
     * @Description 生成令牌,无有效负荷
     * @Throws
     * @Return java.lang.String
     * @Date 2024-02-01 18:21:53
     * @Author WangKun
     */
    public static String creatToken(String username) {
        //设置token响应头
        return Jwts.builder()
                //设置用户名
                .setSubject(username)
                //设置token过期时间
                .setExpiration(new Date(System.currentTimeMillis() + JwtInfoConfig.tokenExpiration))
                //设置token签名算法及秘钥
                .signWith(SignatureAlgorithm.HS512, JwtInfoConfig.tokenSecret).compact();
    }

    /**
     * @param token
     * @Description 解析令牌
     * @Throws
     * @Return com.alibaba.fastjson2.JSONObject
     * @Date 2024-02-01 17:47:15
     * @Author WangKun
     */
    public static JSONObject analyzeToken(String token) {
        Claims claims;
        try {
            // 解析token
            claims = Jwts.parser().setSigningKey(JwtInfoConfig.tokenSecret).parseClaimsJws(token.replace(JwtInfoConfig.tokenPrefix + ".", "")).getBody();
            return new JSONObject(new HashMap<>(claims));
        } catch (ExpiredJwtException e) {
            log.error("令牌过期:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_EXPIRED));
        } catch (UnsupportedJwtException e) {
            log.error("无效的令牌:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_INVALID));
        } catch (MalformedJwtException e) {
            log.error("令牌格式错误:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_FORMAT_ERROR));
        } catch (SignatureException e) {
            log.error("令牌签名错误:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_SIGNATURE_ERROR));
        } catch (IllegalArgumentException e) {
            log.error("非法令牌:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_ILLEGALITY));
        } catch (Exception e) {
            log.error("令牌解析错误:{},{}", e, e.getMessage());
            throw new RuntimeException(String.valueOf(ResultCode.TOKEN_ANALYZE_ERROR));
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值