JwtTokenUtil.java 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package seecoder.devcloud.common.util;
  2. import io.jsonwebtoken.Claims;
  3. import io.jsonwebtoken.Jwts;
  4. import io.jsonwebtoken.SignatureAlgorithm;
  5. import lombok.Data;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.security.core.userdetails.UserDetails;
  8. import org.springframework.stereotype.Component;
  9. import java.util.Date;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. @Data
  13. @ConfigurationProperties(prefix = "seecoder.jwt")
  14. @Component
  15. public class JwtTokenUtil {
  16. private String secret;
  17. private Long expiration;
  18. public String generateToken(UserDetails userDetails) {
  19. Map<String, Object> claims = new HashMap<>(2);
  20. claims.put("sub", userDetails.getUsername());
  21. claims.put("created", new Date());
  22. return generateToken(claims);
  23. }
  24. public String getUsernameFromToken(String token) {
  25. String username;
  26. try {
  27. Claims claims = getClaimsFromToken(token);
  28. username = claims.getSubject();
  29. } catch (Exception e) {
  30. username = null;
  31. }
  32. return username;
  33. }
  34. public Boolean isTokenExpired(String token) {
  35. try {
  36. Claims claims = getClaimsFromToken(token);
  37. Date expiration = claims.getExpiration();
  38. return expiration.before(new Date());
  39. } catch (Exception e) {
  40. return false;
  41. }
  42. }
  43. /**
  44. * 刷新令牌
  45. *
  46. * @param token 原令牌
  47. * @return 新令牌
  48. */
  49. public String refreshToken(String token) {
  50. String refreshedToken;
  51. try {
  52. Claims claims = getClaimsFromToken(token);
  53. claims.put("created", new Date());
  54. refreshedToken = generateToken(claims);
  55. } catch (Exception e) {
  56. refreshedToken = null;
  57. }
  58. return refreshedToken;
  59. }
  60. public Boolean validateToken(String token, UserDetails userDetails) {
  61. String username = getUsernameFromToken(token);
  62. return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
  63. }
  64. private String generateToken(Map<String, Object> claims) {
  65. Date expirationDate = new Date(System.currentTimeMillis() + expiration);
  66. return Jwts.builder().setClaims(claims)
  67. .setExpiration(expirationDate)
  68. .signWith(SignatureAlgorithm.HS512, secret)
  69. .compact();
  70. }
  71. private Claims getClaimsFromToken(String token) {
  72. Claims claims;
  73. try {
  74. claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
  75. } catch (Exception e) {
  76. claims = null;
  77. }
  78. return claims;
  79. }
  80. }