116 lines
3.6 KiB
Java
116 lines
3.6 KiB
Java
package com.cnbm.admin.utils;
|
||
|
||
import io.jsonwebtoken.Claims;
|
||
import io.jsonwebtoken.JwtBuilder;
|
||
import io.jsonwebtoken.Jwts;
|
||
import io.jsonwebtoken.SignatureAlgorithm;
|
||
|
||
import javax.crypto.SecretKey;
|
||
import javax.crypto.spec.SecretKeySpec;
|
||
import java.util.Base64;
|
||
import java.util.Date;
|
||
import java.util.UUID;
|
||
|
||
/**
|
||
* @Author weihongyang
|
||
* @Date 2022/6/8 1:43 PM
|
||
* @Version 1.0
|
||
*/
|
||
public class JwtUtil {
|
||
|
||
//有效期为
|
||
public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000 一个小时
|
||
//设置秘钥明文
|
||
public static final String JWT_KEY = "why";
|
||
|
||
public static String getUUID(){
|
||
String token = UUID.randomUUID().toString().replaceAll("-", "");
|
||
return token;
|
||
}
|
||
|
||
/**
|
||
* 生成jtw
|
||
* @param subject token中要存放的数据(json格式)
|
||
* @return
|
||
*/
|
||
public static String createJWT(String subject) {
|
||
JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
|
||
return builder.compact();
|
||
}
|
||
|
||
/**
|
||
* 生成jtw
|
||
* @param subject token中要存放的数据(json格式)
|
||
* @param ttlMillis token超时时间
|
||
* @return
|
||
*/
|
||
public static String createJWT(String subject, Long ttlMillis) {
|
||
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
|
||
return builder.compact();
|
||
}
|
||
|
||
private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
|
||
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
|
||
SecretKey secretKey = generalKey();
|
||
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);
|
||
return Jwts.builder()
|
||
.setId(uuid) //唯一的ID
|
||
.setSubject(subject) // 主题 可以是JSON数据
|
||
.setIssuer("why") // 签发者
|
||
.setIssuedAt(now) // 签发时间
|
||
.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
|
||
.setExpiration(expDate);
|
||
}
|
||
|
||
/**
|
||
* 创建token
|
||
* @param id
|
||
* @param subject
|
||
* @param ttlMillis
|
||
* @return
|
||
*/
|
||
public static String createJWT(String id, String subject, Long ttlMillis) {
|
||
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
|
||
return builder.compact();
|
||
}
|
||
|
||
public static void main(String[] args) throws Exception {
|
||
// String jwt = createJWT("123");
|
||
Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5OWNhNGJhMjg5ZjU0OTVjODE5YTM0N2ExZmNlZjc0YSIsInN1YiI6IjEyMyIsImlzcyI6IndoeSIsImlhdCI6MTY1NDc1OTg5NiwiZXhwIjoxNjU0NzYzNDk2fQ.CTgS6yQjfXSGPJUTu-_rqjkh_KB_F9SzPThFfnvB5yg");
|
||
String subject = claims.getSubject();
|
||
System.out.println(subject);
|
||
// System.out.println(claims);
|
||
}
|
||
|
||
/**
|
||
* 生成加密后的秘钥 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();
|
||
}
|
||
}
|