jjwt官方文檔:https://github.com/jwtk/jjwt
關(guān)于jjwt的使用官方文檔寫的很詳細
在做shiro無狀態(tài)鑒權(quán)時寫了一個工具類
package com.lv.myframework.utils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Slf4j
public class JwtUtil {
//設(shè)置加密密鑰
private static SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
/**
* 生成token
* @param id 指定token id
* @return
*/
public static String encode(String id){
return JwtUtil.encode(null,false,id);
}
/**
* 生成token
* @param id 指定token id
* @param rememberMe 是否記住我
* @return
*/
public static String encode(String id,Boolean rememberMe){
return JwtUtil.encode(null,true,id);
}
/**
* 生成的token未記住的情況下默認有效時間為10min憨颠,記住我有效期為3day
* @param claims 額外添加到荷部分的信息。
* @param rememberMe 是否記住我
* @return
*/
public static String encode(Map<String, Object> claims,Boolean rememberMe,String id){
if (claims == null) {
claims = new HashMap<>();
}
// 簽發(fā)時間(iat):荷載部分的標準字段之一
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
Date expireDate = null;
if(!rememberMe){
expireDate = new Date(nowMillis + 10*60*1000);
}else{
expireDate = new Date(nowMillis + 3*24*60*60*1000);
}
//TODO 將token信息存入redis
return Jwts.builder().setClaims(claims)
.setIssuedAt(now)
.setId(id)
.setExpiration(expireDate)
.signWith(secretKey).compact();
}
/**
* 根據(jù)token獲取Claims
* @param token
* @return
*/
public static Claims decode(String token){
return Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token).getBody();
}
/**
* 驗證token是否有效
* @param token
* @return
*/
public static Boolean verify(String token){
try {
Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token);
return true;
}catch (ExpiredJwtException e){
log.error(e.getMessage());
return false;
} catch (JwtException e) {
log.error(e.getMessage());
return false;
} catch (Exception e){
log.error(e.getMessage());
return false;
}
}
}