@Configuration
@ConfigurationProperties(prefix = "jwt.token")
public class JwtTokenUtil {
public static void setSecret(String secret) {
JwtTokenUtil.secret = secret;
}
public static void setExpiration(int expiration) {
JwtTokenUtil.expiration = expiration;
}
private static String secret="winner";
private static int expiration=7200;
private static final String CLAIM_KEY_USERNAME="sub";
private static final String CLAIM_KEY_ID="id";
private static final String CLAIM_KEY_CREATED="created";
private static final String CLAIM_KEY_ROLES="roles";
//获得的token中得到用户
public static String getUsernameFromToken(String token){
String username;
try {
username=getClaimsFromToken(token).getSubject();
}catch (Exception e){
username=null;
}
return username;
}
//获得token中的时间
public static Date getCreatedDateFromToken(String token){
Date date;
try {
final Claims claims=getClaimsFromToken(token);
date=new Date((Long)claims.get(CLAIM_KEY_CREATED));
}catch (Exception e)
{
date=null;
}
return date;
}
//从token中获得过期时间
public static Date getExpirationDateFromToken(String token) {
Date expiration;
try {
final Claims claims = getClaimsFromToken(token);
expiration = claims.getExpiration();
} catch (Exception e) {
expiration = null;
}
return expiration;
}
//解析token
private static Claims getClaimsFromToken(String token){
Claims claims;
try {
claims = Jwts.parser().setSigningKey(secret).parseClaimsJwt(token).getBody();
}catch(ExpiredJwtException e){
claims=e.getClaims();
}
return claims;
}
//生成过期时间
private static Date generateExpirationDate(){
//过期事件
return new Date(System.currentTimeMillis()+ expiration);
}
//userDetails中的信息加入到token并调用generateToken生产token
public static String generateToken(Employee userDetails){
Map<String,Object> claims=new HashMap<>();
claims.put(CLAIM_KEY_USERNAME,userDetails.getUsername());
claims.put(CLAIM_KEY_CREATED,new Date());
claims.put(CLAIM_KEY_ID,userDetails.getENo());
claims.put(CLAIM_KEY_ROLES,userDetails.getRoles());
return generateToken(claims);
}
// Jwts.builder()
// .setClaims(map)
.claim("authorities","admin")
// .setExpiration(new Date(System.currentTimeMillis() + 7 * 60 * 1000))
// .signWith(SignatureAlgorithm.HS512, "tmax")
// .compact();
//生产token
public static String generateToken(Map<String,Object> claims){
return Jwts.builder()
// .claim("xx","xxx")
.setClaims(claims)
.setExpiration(generateExpirationDate())
.signWith(SignatureAlgorithm.HS512,secret)
.compact();
}
//判断是否在是否在过期时间之前
private static Boolean isTokenExpired(String token){
final Date expiration=getExpirationDateFromToken(token);
return expiration.before(new Date());
}
//判断是否可以刷下
public static Boolean canTokenBeRefreshed(String token){
return !isTokenExpired(token);
}
//刷新token把CLAIM_KEY_CREATED刷新了
public static String refreshToken(String token){
String refreshedToken;
try{
final Claims claims=getClaimsFromToken(token);
claims.put(CLAIM_KEY_CREATED,new Date());
refreshedToken=generateToken(claims);
}catch(Exception e){
refreshedToken=null;
}
return refreshedToken;
}
//判断token是否过期,是否可用
public static Boolean validateToken(String token, UserDetails userDetails){
Employee user=(Employee)userDetails;
final String username=getUsernameFromToken(token);
final Date created=getCreatedDateFromToken(token);
return username.equals(user.getUsername())&&isTokenExpired(token);
}
}
springBoot JWT工具类
最新推荐文章于 2024-08-01 15:05:06 发布