TokenUtils.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package com.zhentao.config.token;
  2. import com.zhentao.config.enums.ApiServiceExceptionEnum;
  3. import com.zhentao.config.exceptions.ApiException;
  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. /**
  13. * 生成Token工具类
  14. */
  15. public class TokenUtils {
  16. /**
  17. * 签名秘钥
  18. */
  19. public static final String SECRET = "cjyfutu1688";
  20. /**
  21. * 生成token
  22. * @param id 一般传入userName
  23. * @return
  24. */
  25. public static String createJwtToken(String id){
  26. String issuer = "www.futureading.com";
  27. String subject = "65532781@qq.com";
  28. long ttlMillis = System.currentTimeMillis();
  29. return createJwtToken(id, issuer, subject, ttlMillis);
  30. }
  31. /**
  32. * 生成Token
  33. *
  34. * @param id
  35. * 编号
  36. * @param issuer
  37. * 该JWT的签发者,是否使用是可选的
  38. * @param subject
  39. * 该JWT所面向的用户,是否使用是可选的;
  40. * @param ttlMillis
  41. * 签发时间
  42. * @return token String
  43. */
  44. public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
  45. // 签名算法 ,将对token进行签名
  46. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
  47. // 生成签发时间
  48. long nowMillis = System.currentTimeMillis();
  49. Date now = new Date(nowMillis);
  50. // 通过秘钥签名JWT
  51. byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
  52. Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
  53. // Let's set the JWT Claims
  54. JwtBuilder builder = Jwts.builder().setId(id)
  55. .setIssuedAt(now)
  56. .setSubject(subject)
  57. .setIssuer(issuer)
  58. .signWith(signatureAlgorithm, signingKey);
  59. // if it has been specified, let's add the expiration
  60. if (ttlMillis >= 0) {
  61. long expMillis = nowMillis + ttlMillis;
  62. Date exp = new Date(expMillis);
  63. builder.setExpiration(exp);
  64. }
  65. // Builds the JWT and serializes it to a compact, URL-safe string
  66. return builder.compact();
  67. }
  68. // Sample method to validate and read the JWT
  69. public static Claims parseJWT(String jwt) {
  70. // This line will throw an exception if it is not a signed JWS (as expected)
  71. Claims claims = Jwts.parser()
  72. .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
  73. .parseClaimsJws(jwt).getBody();
  74. return claims;
  75. }
  76. public static Long getUserId(String token){
  77. Claims claims = null;
  78. try {
  79. claims = TokenUtils.parseJWT(token);
  80. } catch (Exception e) {
  81. throw new ApiException(ApiServiceExceptionEnum.Login_ERROR);
  82. }
  83. if(null==claims) {
  84. throw new ApiException(ApiServiceExceptionEnum.Login_ERROR);
  85. }
  86. String id = claims.getId();
  87. Long userId=Long.valueOf(id);
  88. return userId;
  89. }
  90. public static void main(String[] args) {
  91. System.out.println(TokenUtils.createJwtToken("admin"));
  92. }
  93. }