package com.zhentao.tool; import com.zhentao.enums.ApiServerException; import com.zhentao.exception.AsynException; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import java.security.Key; import java.util.Date; public class TokenUtils { public static final String SECRET = "cjyfutu1688"; public static String createJwtToken(String id) { String issuer = "www.futureading.com"; String subject = "65532781@qq.com"; long ttlMillis = 3600000; // 例如,设置token有效期为1小时 return createJwtToken(id, issuer, subject, ttlMillis); } public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); JwtBuilder builder = Jwts.builder().setId(id) .setIssuedAt(now) .setSubject(subject) .setIssuer(issuer) .signWith(signatureAlgorithm, signingKey); if (ttlMillis >= 0) { long expMillis = nowMillis + ttlMillis; Date exp = new Date(expMillis); builder.setExpiration(exp); } return builder.compact(); } public static Claims parseJWT(String jwt) { Claims claims = Jwts.parser() .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET)) .parseClaimsJws(jwt).getBody(); return claims; } public static Long getUserId(String token) { Claims claims = null; try { claims = parseJWT(token); } catch (Exception e) { throw new AsynException(ApiServerException.TOKEN_ERR); } if (null == claims) { throw new AsynException(ApiServerException.TOKEN_ERR); } String id = claims.getId(); Long userId = Long.valueOf(id); return userId; } /** * 检查token是否过期 * @param jwt 要检查的token * @return 如果token过期返回true,否则返回false */ public static boolean isTokenExpired(String jwt) { Claims claims = parseJWT(jwt); Date exp = claims.getExpiration(); if (exp == null) { // 如果没有设置过期时间,可以认为token不过期 return false; } return exp.before(new Date()); // 比较当前时间和过期时间 } public static void main(String[] args) { String token = TokenUtils.createJwtToken("admin"); System.out.println("Token: " + token); System.out.println("Is expired: " + TokenUtils.isTokenExpired(token)); } }