AppJwtUtil.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.zt.utils;
  2. import io.jsonwebtoken.*;
  3. import javax.crypto.SecretKey;
  4. import javax.crypto.spec.SecretKeySpec;
  5. import java.util.*;
  6. public class AppJwtUtil {
  7. // TOKEN的有效期一天(S)
  8. private static final int TOKEN_TIME_OUT = 3_600;
  9. // 加密KEY
  10. private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
  11. // 最小刷新间隔(S)
  12. private static final int REFRESH_TIME = 300;
  13. // 生产ID
  14. public static String getToken(Long id){
  15. Map<String, Object> claimMaps = new HashMap<>();
  16. claimMaps.put("id",id);
  17. long currentTime = System.currentTimeMillis();
  18. return Jwts.builder()
  19. .setId(UUID.randomUUID().toString())
  20. .setIssuedAt(new Date(currentTime)) //签发时间
  21. .setSubject("system") //说明
  22. .setIssuer("heima") //签发者信息
  23. .setAudience("app") //接收用户
  24. .compressWith(CompressionCodecs.GZIP) //数据压缩方式
  25. .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
  26. .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
  27. .addClaims(claimMaps) //cla信息
  28. .compact();
  29. }
  30. /**
  31. * 获取token中的claims信息
  32. *
  33. * @param token
  34. * @return
  35. */
  36. private static Jws<Claims> getJws(String token) {
  37. return Jwts.parser()
  38. .setSigningKey(generalKey())
  39. .parseClaimsJws(token);
  40. }
  41. /**
  42. * 获取payload body信息
  43. *
  44. * @param token
  45. * @return
  46. */
  47. public static Claims getClaimsBody(String token) {
  48. try {
  49. return getJws(token).getBody();
  50. }catch (ExpiredJwtException e){
  51. return null;
  52. }
  53. }
  54. /**
  55. * 获取hearder body信息
  56. *
  57. * @param token
  58. * @return
  59. */
  60. public static JwsHeader getHeaderBody(String token) {
  61. return getJws(token).getHeader();
  62. }
  63. /**
  64. * 是否过期
  65. *
  66. * @param claims
  67. * @return -1:有效,0:有效,1:过期,2:过期
  68. */
  69. public static int verifyToken(Claims claims) {
  70. if(claims==null){
  71. return 1;
  72. }
  73. try {
  74. claims.getExpiration()
  75. .before(new Date());
  76. // 需要自动刷新TOKEN
  77. if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
  78. return -1;
  79. }else {
  80. return 0;
  81. }
  82. } catch (ExpiredJwtException ex) {
  83. return 1;
  84. }catch (Exception e){
  85. return 2;
  86. }
  87. }
  88. /**
  89. * 由字符串生成加密key
  90. *
  91. * @return
  92. */
  93. public static SecretKey generalKey() {
  94. byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
  95. SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
  96. return key;
  97. }
  98. public static void main(String[] args) {
  99. /* Map map = new HashMap();
  100. map.put("id","11");*/
  101. System.out.println(AppJwtUtil.getToken(1102L));
  102. Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAAC2L0QqDMAwA_yXPFkw6a-LfxDawDoRCK2yM_bsR9nbHcV94jQobRGHKO-UwG1F4mEkQ1hJy4ZjKWjRyggmqDtgwIQuvssgE_dz97p8-7Lh7765Pq4e66VnctDVne7f_KbjcZ_WGONPvAsM25luDAAAA._HLSpxHpSl4KZbYtSx1xnyeaRpsJTQ5xz6wMfFehqUr5etW6pOhCuP4EdrhSBefJZ5evmfYcUAj_dbHkLVdxSQ");
  103. Claims claims = jws.getBody();
  104. int i = AppJwtUtil.verifyToken(claims);
  105. System.out.println(i);
  106. System.out.println(claims.get("id"));
  107. /*Date date = new Date(20000000000000L);
  108. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  109. String format = sdf.format(date);
  110. System.out.println(format);*/
  111. }
  112. }