JwtUtil.java 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package com.sky.utils;
  2. import io.jsonwebtoken.Claims;
  3. import io.jsonwebtoken.JwtBuilder;
  4. import io.jsonwebtoken.Jwts;
  5. import io.jsonwebtoken.SignatureAlgorithm;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.Date;
  8. import java.util.Map;
  9. public class JwtUtil {
  10. /**
  11. * 生成jwt
  12. * 使用Hs256算法, 私匙使用固定秘钥
  13. *
  14. * @param secretKey jwt秘钥
  15. * @param ttlMillis jwt过期时间(毫秒)
  16. * @param claims 设置的信息
  17. * @return
  18. */
  19. public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
  20. // 指定签名的时候使用的签名算法,也就是header那部分
  21. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
  22. // 生成JWT的时间
  23. long expMillis = System.currentTimeMillis() + ttlMillis;
  24. Date exp = new Date(expMillis);
  25. // 设置jwt的body
  26. JwtBuilder builder = Jwts.builder()
  27. // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
  28. .setClaims(claims)
  29. // 设置签名使用的签名算法和签名使用的秘钥
  30. .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
  31. // 设置过期时间
  32. .setExpiration(exp);
  33. return builder.compact();
  34. }
  35. /**
  36. * Token解密
  37. *
  38. * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
  39. * @param token 加密后的token
  40. * @return
  41. */
  42. public static Claims parseJWT(String secretKey, String token) {
  43. // 得到DefaultJwtParser
  44. Claims claims = Jwts.parser()
  45. // 设置签名的秘钥
  46. .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
  47. // 设置需要解析的jwt
  48. .parseClaimsJws(token).getBody();
  49. return claims;
  50. }
  51. }