TokenUtils.java 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package com.zhentao.tool;
  2. import com.zhentao.enums.ApiServerException;
  3. import com.zhentao.exception.AsynException;
  4. import io.jsonwebtoken.Claims;
  5. import io.jsonwebtoken.JwtBuilder;
  6. import io.jsonwebtoken.Jwts;
  7. import io.jsonwebtoken.SignatureAlgorithm;
  8. import javax.crypto.spec.SecretKeySpec;
  9. import javax.xml.bind.DatatypeConverter;
  10. import java.security.Key;
  11. import java.util.Date;
  12. public class TokenUtils {
  13. public static final String SECRET = "cjyfutu1688";
  14. public static String createJwtToken(String id) {
  15. String issuer = "www.futureading.com";
  16. String subject = "65532781@qq.com";
  17. long ttlMillis = 3600000; // 例如,设置token有效期为1小时
  18. return createJwtToken(id, issuer, subject, ttlMillis);
  19. }
  20. public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
  21. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
  22. long nowMillis = System.currentTimeMillis();
  23. Date now = new Date(nowMillis);
  24. byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
  25. Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
  26. JwtBuilder builder = Jwts.builder().setId(id)
  27. .setIssuedAt(now)
  28. .setSubject(subject)
  29. .setIssuer(issuer)
  30. .signWith(signatureAlgorithm, signingKey);
  31. if (ttlMillis >= 0) {
  32. long expMillis = nowMillis + ttlMillis;
  33. Date exp = new Date(expMillis);
  34. builder.setExpiration(exp);
  35. }
  36. return builder.compact();
  37. }
  38. public static Claims parseJWT(String jwt) {
  39. Claims claims = Jwts.parser()
  40. .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
  41. .parseClaimsJws(jwt).getBody();
  42. return claims;
  43. }
  44. public static Long getUserId(String token) {
  45. Claims claims = null;
  46. try {
  47. claims = parseJWT(token);
  48. } catch (Exception e) {
  49. throw new AsynException(ApiServerException.TOKEN_ERR);
  50. }
  51. if (null == claims) {
  52. throw new AsynException(ApiServerException.TOKEN_ERR);
  53. }
  54. String id = claims.getId();
  55. Long userId = Long.valueOf(id);
  56. return userId;
  57. }
  58. /**
  59. * 检查token是否过期
  60. * @param jwt 要检查的token
  61. * @return 如果token过期返回true,否则返回false
  62. */
  63. public static boolean isTokenExpired(String jwt) {
  64. Claims claims = parseJWT(jwt);
  65. Date exp = claims.getExpiration();
  66. if (exp == null) {
  67. // 如果没有设置过期时间,可以认为token不过期
  68. return false;
  69. }
  70. return exp.before(new Date()); // 比较当前时间和过期时间
  71. }
  72. public static void main(String[] args) {
  73. String token = TokenUtils.createJwtToken("admin");
  74. System.out.println("Token: " + token);
  75. System.out.println("Is expired: " + TokenUtils.isTokenExpired(token));
  76. }
  77. }