使用方式
1. 生成 JWT令牌
// 配置要存储的数据
HashMap<String, Object> map = new HashMap<>();
map.put("id",1);
map.put("name","LuckyDu");
// 使用默认配置生成JWT令牌
String jwtToken = JWTUtils.getJwtToken(map);
System.out.println("jwtToken = " + jwtToken);
// 自定义配置生成JWT令牌
SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;// 设置签名算法
String signKey = "luckyDu"; // 加盐 不能过短,过短会报错,至少4个字符,具体版本不同可能不一样
Date outTime = new Date(System.currentTimeMillis() + 3600 * 1000);
String jwtToken1 = JWTUtils.getJwtToken(hs256, signKey, map, outTime);
System.out.println("jwtToken1 = " + jwtToken1);
2. 解析 JWT令牌
// 生成的JWT令牌
String jwtToken = "【这里填写您生成的jwt令牌】";
// 使用默认配置解析
Jws<Claims> claimsJws = JWTUtils.parseJwtToken(jwtToken);
System.out.println("claimsJws = " + claimsJws);
// 使用自定义配置解析
String signKey = "luckyDu"; // 自定义的生成jwt令牌的 盐值
Jws<Claims> claimsJws1 = JWTUtils.parseJwtToken(jwtToken, signKey);
System.out.println("claimsJws1 = " + claimsJws1);
3. JWT工具类
import io.jsonwebtoken.*;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
* JWT 生成工具类
*/
public class JWTUtils implements Serializable {
/**
* 设置盐值
*/
private static final String signKey = "LuckyDu";
/**
* 设置Token过期时间 一小时
*/
private static final Date outTime = new Date(System.currentTimeMillis() + 3600 * 1000);
/**
* 设置加密算法 HS256
*/
private static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;
/**
* 生成 JWT Token
* @param signatureAlgorithm 签名算法
* @param signKey 自定义盐值
* @param map 数据
* @param outTime 过期时间
* @return
*/
public static String getJwtToken(SignatureAlgorithm signatureAlgorithm,String signKey,Map<String,Object> map,Date outTime){
String compact = Jwts.builder()
.signWith(signatureAlgorithm, signKey) // 设置JWT头部信息,加密算法和盐值
.setClaims(map) // 设置JWT的荷载信息,需要一个Map集合存储
.setExpiration(outTime) // 设置过期时间,设置的是时间点
.compact(); // 调用生成令牌
return compact;
}
/**
* 使用默认配置生成JWT token
* @param map 数据 Map
* @return
*/
public static String getJwtToken(Map<String,Object> map){
String jwtToken = getJwtToken(SIGNATURE_ALGORITHM, signKey, map, outTime);
return jwtToken;
}
/**
* 解析 JWT token
* @param compact 令牌字符串
* @param signKey 生成时候的盐值
* @return
* @throws ExpiredJwtException JWT令牌过期抛出异常
* @throws UnsupportedJwtException jwt令牌不支持的异常
* @throws MalformedJwtException 头部信息出错抛出异常
* @throws SignatureException 荷载信息出错抛出异常 签名信息出错抛出异常
* @throws IllegalArgumentException 传入参数异常
*/
public static Jws<Claims> parseJwtToken(String compact ,String signKey) throws ExpiredJwtException, UnsupportedJwtException, MalformedJwtException, SignatureException, IllegalArgumentException{
Jws<Claims> claimsJws = Jwts.parser() // 解析JWT令牌方法
.setSigningKey(signKey) // 设置盐值
.parseClaimsJws(compact);// 传入生成的令牌
return claimsJws;
}
/**
*
* @param compact 令牌字符串
* @return
* @throws ExpiredJwtException
* @throws UnsupportedJwtException
* @throws MalformedJwtException
* @throws SignatureException
* @throws IllegalArgumentException
*/
public static Jws<Claims> parseJwtToken(String compact) throws ExpiredJwtException, UnsupportedJwtException, MalformedJwtException, SignatureException, IllegalArgumentException{
Jws<Claims> claimsJws = parseJwtToken(compact,signKey);// 传入生成的令牌
return claimsJws;
}
}