JwtUtil.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package com.fdkankan.fusion.common.util;
  2. import com.auth0.jwt.JWT;
  3. import com.auth0.jwt.exceptions.JWTDecodeException;
  4. import com.auth0.jwt.interfaces.DecodedJWT;
  5. import io.jsonwebtoken.Claims;
  6. import io.jsonwebtoken.JwtBuilder;
  7. import io.jsonwebtoken.Jwts;
  8. import io.jsonwebtoken.SignatureAlgorithm;
  9. import java.util.Date;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. import java.util.UUID;
  13. public class JwtUtil {
  14. //生成签名的时候使用的秘钥secret
  15. private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK&sdfkjsdrow32234545fdf>?N<:{LWPW";
  16. /**
  17. * 用户登录成功后生成Jwt
  18. * 使用Hs256算法 私匙使用用户密码
  19. *
  20. * @param ttlMillis jwt过期时间
  21. * @param userName 用户名
  22. * @return
  23. */
  24. public static String createJWT(long ttlMillis, String userName, String loginType) {
  25. //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
  26. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
  27. //生成JWT的时间
  28. long nowMillis = System.currentTimeMillis();
  29. Date now = new Date(nowMillis);
  30. //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
  31. Map<String, Object> claims = new HashMap<String, Object>();
  32. claims.put("userName", userName);
  33. claims.put("loginType", loginType);
  34. //下面就是在为payload添加各种标准声明和私有声明了
  35. //这里其实就是new一个JwtBuilder,设置jwt的body
  36. JwtBuilder builder = Jwts.builder()
  37. //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
  38. .setClaims(claims)
  39. //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
  40. .setId(UUID.randomUUID().toString())
  41. //iat: jwt的签发时间
  42. .setIssuedAt(now)
  43. //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
  44. .setSubject(userName)
  45. //设置签名使用的签名算法和签名使用的秘钥
  46. .signWith(signatureAlgorithm, SECRET);
  47. if (ttlMillis >= 0) {
  48. long expMillis = nowMillis + ttlMillis;
  49. Date exp = new Date(expMillis);
  50. //设置过期时间
  51. builder.setExpiration(exp);
  52. }/*else{
  53. //设置过期时间半小时
  54. DateTime expDate = new DateTime().plusMinutes(30);
  55. builder.setExpiration(expDate.toDate());
  56. }*/
  57. return builder.compact();
  58. }
  59. /**
  60. * Token的解密
  61. * @param token 加密后的token
  62. * @return
  63. */
  64. public static Claims parseJWT(String token) {
  65. //得到DefaultJwtParser
  66. Claims claims = Jwts.parser()
  67. //设置签名的秘钥
  68. .setSigningKey(SECRET)
  69. //设置需要解析的jwt
  70. .parseClaimsJws(token).getBody();
  71. return claims;
  72. }
  73. /**
  74. * 校验token
  75. * 在这里可以使用官方的校验,我这里校验的是token中携带的密码于数据库一致的话就校验通过
  76. * @param token
  77. * @param userName
  78. * @return
  79. */
  80. public static Boolean isVerify(String token, String userName) {
  81. try {
  82. //得到DefaultJwtParser
  83. Claims claims = Jwts.parser()
  84. //设置签名的秘钥
  85. .setSigningKey(SECRET)
  86. //设置需要解析的jwt
  87. .parseClaimsJws(token).getBody();
  88. if (claims.get("userName").equals(userName)) {
  89. return true;
  90. }
  91. }catch (Exception e){
  92. return false;
  93. }
  94. return false;
  95. }
  96. /**
  97. * 获得token中的信息无需secret解密也能获得
  98. *
  99. * @return token中包含的用户名
  100. */
  101. public static String getUsername(String token) {
  102. try {
  103. DecodedJWT jwt = JWT.decode(token);
  104. return jwt.getClaim("userName").asString();
  105. } catch (JWTDecodeException e) {
  106. return null;
  107. }
  108. }
  109. /**
  110. * 获得token中的信息无需secret解密也能获得
  111. *
  112. * @return token中包含的用户名
  113. */
  114. public static String getLoginType(String token) {
  115. try {
  116. DecodedJWT jwt = JWT.decode(token);
  117. return jwt.getClaim("loginType").asString();
  118. } catch (JWTDecodeException e) {
  119. return null;
  120. }
  121. }
  122. public static void main(String[] args) {
  123. long start = System.currentTimeMillis();
  124. System.out.println(getUsername("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxODgxOTI3MjIwOCIsImxvZ2luVHlwZSI6InVzZXIiLCJ1c2VyTmFtZSI6IjE4ODE5MjcyMjA4IiwiaWF0IjoxNjcxNDIzMzcwLCJqdGkiOiI2MjQzN2MyMC0xNzM5LTQxNWItOWJhOC02MzdjY2YzMGQyZTUifQ.W2vp3xwggP6W5g2fpj84BD7ChaqbIH-xjMjBFO2qVXo"));
  125. System.out.println(System.currentTimeMillis() - start);
  126. }
  127. }