jjwt官方文档:https://github.com/jwtk/jjwt
关于jjwt的使用官方文档写的很详细
在做shiro无状态鉴权时写了一个工具类
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 {
//设置加密密钥
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<>();
}
// 签发时间(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();
}
/**
* 根据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;
}
}
}