這里直接寫了一個JwtUtil工具類,省略攔截器操作及控制層操作
public class JwtUtil {
/**
* 過期時間15分鍾
*/
private static final long EXPIRE_TIME = 15 * 60 * 1000;
/**
* token私鑰
*/
private static final String TOKEN_SECRET="DD5654D654DSD5S1D65S4D65S1D";
/**
* 生成簽名15分鍾后過期
*
* @param userName 用戶名
* @param userId 用戶ID
* @return 加密的token
*/
public static String sign(String userName,String userId){
try {
//過期時間
Date date =new Date(System.currentTimeMillis()+EXPIRE_TIME);
//私鑰及加密算法
Algorithm algorithm=Algorithm.HMAC256(TOKEN_SECRET);
//設置頭部信息
Map<String,Object> header=new HashMap<>(2);
header.put("typ","JWT");
header.put("alg","hs256");
//附帶userName userId信息,生成簽名
return JWT.create()
.withHeader(header)
.withClaim("userName",userName)
.withClaim("userId",userId)
.withExpiresAt(date)
.sign(algorithm);
}catch (Exception ex){
return null;
}
}
/**
* 校驗token是否正確
*
* @param token 密鑰
* @return 是否正確
*/
public static boolean verify(String token){
try{
Algorithm algorithm=Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier=JWT.require(algorithm)
.build();
DecodedJWT JWT=verifier.verify(token);
return true;
}catch (Exception ex){
return false;
}
}
/**
* 獲取token中的信息無需secret解密也能獲取
*
* @param token 密鑰
* @return token中包含的用戶名
*/
public static String getUserName(String token){
try {
DecodedJWT jwt=JWT.decode(token);
return jwt.getClaim("userName").asString();
}catch (JWTDecodeException ex){
return null;
}
}
/**
* 獲取token中的信息無需secret解密也能獲取
*
* @param token 密鑰
* @return token中包含的用戶ID
*/
public static String getUserId(String token){
try {
DecodedJWT jwt=JWT.decode(token);
return jwt.getClaim("userId").asString();
}catch (JWTDecodeException ex){
return null;
}
}
}
