package com.dg.core.manager; import com.dg.core.db.gen.entity.HuaChengSysUser; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.stereotype.Component; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * token验证处理 * * @author ruoyi */ @Component public class JWTTokenUtil implements Serializable { /** * 从数据声明生成令牌 * * @param claims * 数据声明 * @return 令牌 */ private static String generateToken(Map claims) { Date expirationDate = new Date(System.currentTimeMillis() + TokenConstant.EXPIRETIME_LONG * 60 * 1000 * 72); return Jwts.builder().setClaims(claims).setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS512, TokenConstant.SECRET).compact(); } /** * 生成刷新token * * @param claims * tokenbody * @return refreshtoken */ private static String generateTokenRefreshToken(Map claims) { Date expirationDate = new Date(System.currentTimeMillis() + TokenConstant.EXPIRETIME_REFRESH * 60 * 60 * 1000); return Jwts.builder().setClaims(claims).setExpiration(expirationDate) .signWith(SignatureAlgorithm.HS512, TokenConstant.SECRET).compact(); } /** * 从令牌中获取数据声明 * * @param token * 令牌 * @return 数据声明 */ public static Claims getClaimsFromToken(String token) { Claims claims; try { claims = Jwts.parser().setSigningKey(TokenConstant.SECRET).parseClaimsJws(token).getBody(); } catch (Exception e) { claims = null; } return claims; } /** * 生成令牌 * * @param loginUserInfoVO * 用户 * @return 令牌 */ public static String generateToken(HuaChengSysUser loginUserInfoVO) { Map claims = new HashMap<>(2); claims.put("sub", loginUserInfoVO.getUserId()); claims.put("created", new Date()); claims.put("type", loginUserInfoVO.getType()); return generateToken(claims); } /** * 从令牌中获取用户名 * * @param token * 令牌 * @return 用户名 */ public static String getUsernameFromToken(String token) { String username; try { Claims claims = getClaimsFromToken(token); username = claims.getSubject(); } catch (Exception e) { username = null; } return username; } /** * 判断令牌是否过期 * * @param token * 令牌 * @return 是否过期 */ public static Boolean isTokenExpired(String token) { try { Claims claims = getClaimsFromToken(token); Date expiration = claims.getExpiration(); return expiration.before(new Date()); } catch (Exception e) { return true; } } /** * 刷新令牌 * * @param token * 原令牌 * @return 新令牌 */ public static String refreshToken(String token) { String refreshedToken; try { Claims claims = getClaimsFromToken(token); claims.put("created", new Date()); refreshedToken = generateToken(claims); } catch (Exception e) { refreshedToken = null; } return refreshedToken; } /** * 验证令牌 * * @param token * 令牌 * @param loginUserInfoVO * 用户 * @return 是否有效 */ public static Boolean validateToken(String token, HuaChengSysUser loginUserInfoVO) { String username = getUsernameFromToken(token); return (username.equals(loginUserInfoVO.getUserId()) && !isTokenExpired(token)); } public static void main(String[] args) { Claims claims = JWTTokenUtil.getClaimsFromToken( "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjIsInR5cGUiOjEsImV4cCI6MTYwNjM1NzkzOSwiY3JlYXRlZCI6MTYwNjM1NjEzOTEzN30.zIj31TLHk4B9F45OszrJWfOlhZL5CWviP2RgsFP6LZuci6MlPn0iVbekioP01DRsu59mWd5FMyhd9WLvMtfxMg"); Boolean tokenExpired = JWTTokenUtil.isTokenExpired( "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjIsInR5cGUiOjEsImV4cCI6MTYwNjM2MDQzNSwiY3JlYXRlZCI6MTYwNjM1ODYzNTI3MX0.7R3SG6hu-sr_KiPpgepubl_1FdaooCNJ0URHWv6Jynr7m8JIar2kUAnhHfWOfHrNILQb5Q-nqxceXdavcuVOXg"); System.out.println(claims); } /** * 生成刷新token * * @param loginUserInfoVO * 登录用户基本信息 * @return refreshtoken */ public static String generateRefeshToken(HuaChengSysUser loginUserInfoVO) { Map claims = new HashMap<>(2); claims.put("sub", loginUserInfoVO.getUserId()); claims.put("created", new Date()); claims.put("type", loginUserInfoVO.getType()); return generateTokenRefreshToken(claims); } }