JwtUtil.java 5.0 KB

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