TokenUtils.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package com.qs.mp.common.utils;
  2. import java.security.Key;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.spec.InvalidKeySpecException;
  5. import java.security.spec.KeySpec;
  6. import java.util.Date;
  7. import javax.crypto.SecretKeyFactory;
  8. import javax.crypto.spec.PBEKeySpec;
  9. import javax.servlet.http.HttpServletRequest;
  10. import com.qs.mp.common.token.TokenUser;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import com.alibaba.fastjson.JSON;
  15. import com.alibaba.fastjson.JSONObject;
  16. import com.qs.mp.common.exception.NoAuthorizationException;
  17. import io.jsonwebtoken.Claims;
  18. import io.jsonwebtoken.Jws;
  19. import io.jsonwebtoken.Jwts;
  20. /**
  21. *
  22. * Token生成工具及验证
  23. *
  24. * @author duota
  25. *
  26. */
  27. public class TokenUtils {
  28. private final static Logger logger = LoggerFactory.getLogger(TokenUtils.class);
  29. @Value("${jwt.secret}")
  30. private static String secret = "lOi58Jhy6dt";
  31. // token过期时间天数
  32. @Value("${jwt.expdays}")
  33. private static int EXP_DAYS = 30;
  34. private static Key key = null;
  35. static {
  36. SecretKeyFactory keyFactory;
  37. try {
  38. keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
  39. KeySpec keySpec = new PBEKeySpec(secret.toCharArray());
  40. key = keyFactory.generateSecret(keySpec);
  41. } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
  42. logger.error("",e);
  43. }
  44. }
  45. public static String create(TokenUser user) {
  46. String json = JSON.toJSONString(user);
  47. return Jwts.builder().setSubject(user.getUserId()).setClaims(JSON.parseObject(json))
  48. .setExpiration(DateUtils.addDays(new Date(), EXP_DAYS)).signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, key).compact();
  49. }
  50. public static TokenUser parse(String compactJws) throws NoAuthorizationException {
  51. if (compactJws == null) {
  52. throw new NoAuthorizationException();
  53. }
  54. try {
  55. Jws<Claims> claims = Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);
  56. Claims body = claims.getBody();
  57. JSONObject jsonObject = new JSONObject(body);
  58. return JSON.toJavaObject(jsonObject, TokenUser.class);
  59. } catch (Exception e) {
  60. logger.error("",e);
  61. throw new NoAuthorizationException();
  62. }
  63. }
  64. public static boolean checkToken(HttpServletRequest request) {
  65. String token = getToken(request);
  66. return checkToken(token);
  67. }
  68. public static boolean checkToken(String compactJws) {
  69. try {
  70. Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);
  71. return true;
  72. } catch (Exception e) {
  73. return false;
  74. }
  75. }
  76. public static TokenUser parse(HttpServletRequest request) throws NoAuthorizationException {
  77. String token = getToken(request);
  78. return parse(token);
  79. }
  80. public static String getToken(HttpServletRequest request) {
  81. String jwt = request.getHeader("Authorization");
  82. if (jwt == null) {
  83. return null;
  84. }
  85. jwt = jwt.replace("Bearer", "").trim();
  86. return jwt;
  87. }
  88. public static void main(String[] args) {
  89. TokenUser user = new TokenUser();
  90. user.setUserId("E5KH1S648MLVVXH71L1X");
  91. String jwt = create(user);
  92. System.out.println("jwt:" + jwt);
  93. try {
  94. Thread.sleep(1000);
  95. System.out.println("checkToken:" + checkToken(jwt));
  96. TokenUser user2 = parse(jwt);
  97. System.out.println(JSON.toJSONString(user2));
  98. } catch (Exception e) {
  99. e.printStackTrace();
  100. }
  101. }
  102. }