1. <dependency>
    2. <groupId>io.jsonwebtoken</groupId>
    3. <artifactId>jjwt</artifactId>
    4. <version>0.9.0</version>
    5. </dependency>
    1. package com.lyd.springsecurity1.utils;
    2. import io.jsonwebtoken.Claims;
    3. import io.jsonwebtoken.JwtBuilder;
    4. import io.jsonwebtoken.Jwts;
    5. import io.jsonwebtoken.SignatureAlgorithm;
    6. import javax.crypto.SecretKey;
    7. import javax.crypto.spec.SecretKeySpec;
    8. import java.util.Base64;
    9. import java.util.Date;
    10. import java.util.UUID;
    11. /**
    12. * JWT工具类
    13. */
    14. public class JwtUtil {
    15. //有效期为
    16. public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000 一个小时
    17. //设置秘钥明文
    18. public static final String JWT_KEY = "sangeng";
    19. public static String getUUID(){
    20. String token = UUID.randomUUID().toString().replaceAll("-", "");
    21. return token;
    22. }
    23. /**
    24. * 生成jtw
    25. * @param subject token中要存放的数据(json格式)
    26. * @return
    27. */
    28. public static String createJWT(String subject) {
    29. JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
    30. return builder.compact();
    31. }
    32. /**
    33. * 生成jtw
    34. * @param subject token中要存放的数据(json格式)
    35. * @param ttlMillis token超时时间
    36. * @return
    37. */
    38. public static String createJWT(String subject, Long ttlMillis) {
    39. JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
    40. return builder.compact();
    41. }
    42. private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
    43. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    44. SecretKey secretKey = generalKey();
    45. long nowMillis = System.currentTimeMillis();
    46. Date now = new Date(nowMillis);
    47. if(ttlMillis==null){
    48. ttlMillis=JwtUtil.JWT_TTL;
    49. }
    50. long expMillis = nowMillis + ttlMillis;
    51. Date expDate = new Date(expMillis);
    52. return Jwts.builder()
    53. .setId(uuid) //唯一的ID
    54. .setSubject(subject) // 主题 可以是JSON数据
    55. .setIssuer("sg") // 签发者
    56. .setIssuedAt(now) // 签发时间
    57. .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
    58. .setExpiration(expDate);
    59. }
    60. /**
    61. * 创建token
    62. * @param id
    63. * @param subject
    64. * @param ttlMillis
    65. * @return
    66. */
    67. public static String createJWT(String id, String subject, Long ttlMillis) {
    68. JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
    69. return builder.compact();
    70. }
    71. public static void main(String[] args) throws Exception {
    72. String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJjYWM2ZDVhZi1mNjVlLTQ0MDAtYjcxMi0zYWEwOGIyOTIwYjQiLCJzdWIiOiJzZyIsImlzcyI6InNnIiwiaWF0IjoxNjM4MTA2NzEyLCJleHAiOjE2MzgxMTAzMTJ9.JVsSbkP94wuczb4QryQbAke3ysBDIL5ou8fWsbt_ebg";
    73. Claims claims = parseJWT(token);
    74. System.out.println(claims);
    75. }
    76. /**
    77. * 生成加密后的秘钥 secretKey
    78. * @return
    79. */
    80. public static SecretKey generalKey() {
    81. byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
    82. SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    83. return key;
    84. }
    85. /**
    86. * 解析
    87. *
    88. * @param jwt
    89. * @return
    90. * @throws Exception
    91. */
    92. public static Claims parseJWT(String jwt) throws Exception {
    93. SecretKey secretKey = generalKey();
    94. return Jwts.parser()
    95. .setSigningKey(secretKey)
    96. .parseClaimsJws(jwt)
    97. .getBody();
    98. }
    99. }