From 1acf9a48021d0af1d81fdf3ed8fcf8dffd020f6b Mon Sep 17 00:00:00 2001 From: hongjli <3117313295@qq.com> Date: 星期二, 15 四月 2025 14:20:51 +0800 Subject: [PATCH] 登录,注册,获取用户信息---接口 --- src/main/java/com/weiwojc/utils/JwtUtils.java | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 109 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/weiwojc/utils/JwtUtils.java b/src/main/java/com/weiwojc/utils/JwtUtils.java new file mode 100644 index 0000000..4d4b673 --- /dev/null +++ b/src/main/java/com/weiwojc/utils/JwtUtils.java @@ -0,0 +1,109 @@ +package com.weiwojc.utils; + +import com.weiwojc.model.entity.User; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.security.Keys; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.crypto.SecretKey; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Component +@RequiredArgsConstructor +public class JwtUtils { + + private static final long SERVER_START_TIME = System.currentTimeMillis(); + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private Long expiration; + + private final TokenBlacklistManager tokenBlacklistManager; + + private SecretKey getSigningKey() { + byte[] keyBytes = secret.getBytes(StandardCharsets.UTF_8); + return Keys.hmacShaKeyFor(keyBytes); + } + + public String generateToken(User user) { + Map<String, Object> claims = new HashMap<>(); + claims.put("userId", user.getUserId()); + claims.put("username", user.getUsername()); + claims.put("instanceId", tokenBlacklistManager.getInstanceId()); + claims.put("serverStartTime", SERVER_START_TIME); + + return Jwts.builder() + .setClaims(claims) + .setSubject(user.getUsername()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) + .signWith(getSigningKey()) + .compact(); + } + + public Claims getClaimsFromToken(String token) { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + + public String getUsernameFromToken(String token) { + return getClaimsFromToken(token).getSubject(); + } + + public Long getUserIdFromToken(String token) { + return getClaimsFromToken(token).get("userId", Long.class); + } + + public String getInstanceIdFromToken(String token) { + return getClaimsFromToken(token).get("instanceId", String.class); + } + + public Date getExpirationDateFromToken(String token) { + return getClaimsFromToken(token).getExpiration(); + } + + public boolean isTokenExpired(String token) { + Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + + public boolean validateToken(String token) { + try { + Claims claims = getClaimsFromToken(token); + + if (isTokenExpired(token)) { + return false; + } + + String tokenInstanceId = claims.get("instanceId", String.class); + String currentInstanceId = tokenBlacklistManager.getInstanceId(); + if (!currentInstanceId.equals(tokenInstanceId)) { + return false; + } + + Long tokenServerStartTime = claims.get("serverStartTime", Long.class); + if (tokenServerStartTime == null || tokenServerStartTime != SERVER_START_TIME) { + return false; + } + + if (tokenBlacklistManager.isBlacklisted(token)) { + return false; + } + + return true; + } catch (Exception e) { + return false; + } + } +} \ No newline at end of file -- Gitblit v1.9.3