1.引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.3</version>
</dependency>
2.工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
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
public class JwtUtil {
private static final String USER_CLAIMS_KEY = "user";
// 过期时间
@Value("${token.expirationTime}")
private long EXPIRE_TIME;
// 密钥
@Value("${token.secretKey}")
private String SECRET;
/**
* 创建JWT Token
*
* @param payload 载荷(Claims)
* @return JWT Token
*/
public String createToken(Map<String, Object> payload) {
// 1. 创建一个密钥
SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));
// 2. 创建JWT Builder
// 注意:这里的签名算法不能是 RS256,需要使用 HS256
io.jsonwebtoken.JwtBuilder builder = Jwts.builder()
.setClaims(payload)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE_TIME))
.signWith(key, SignatureAlgorithm.HS256);
// 3. 生成JWT Token
return builder.compact();
}
/**
* 解析JWT Token
*
* @param token JWT Token
* @return 载荷(Claims)
*/
public Map<String, Object> parseToken(String token) {
// 1. 获取密钥
SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));
// 2. 解析JWT Token
Claims claims = Jwts.parser()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
// 3. 将Claims里的内容转换成Map
Map<String, Object> payload = new HashMap<>(claims);
payload.remove("exp");
payload.remove("iat");
payload.remove("iss");
payload.remove("aud");
payload.remove("nbf");
payload.remove("sub");
payload.remove("jti");
return payload;
}
/**
* 获取JWT Token的过期时间
*
* @param token JWT Token
* @return 过期时间
*/
public Date getExpirationDateFromToken(String token) {
Claims claims = parseClaims(token);
if (claims != null) {
return claims.getExpiration();
}
return null;
}
/**
* 验证JWT Token是否有效
*
* @param token JWT Token
* @return 是否有效
*/
public boolean validateToken(String token) {
try {
parseClaims(token);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 获取payload中的用户信息
*
* @param token JWT Token
* @return 用户信息
*/
public Map<String, Object> getUserFromToken(String token) {
Map<String, Object> user = null;
Claims claims = parseClaims(token);
if (claims != null) {
user = (Map<String, Object>) claims.get(USER_CLAIMS_KEY);
}
return user;
}
/**
* 解析JWT Token中的Claims
*
* @param token JWT Token
* @return Claims
*/
public Claims parseClaims(String token) {
try {
SecretKey key = Keys.hmacShaKeyFor(SECRET.getBytes(StandardCharsets.UTF_8));
return Jwts.parser()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
return null;
}
}
}
注意:
现版本的JJWT对密钥key的安全性做了强制性要求,这里建议密钥尽量长一点,或者配合uuid使用。
最后最后!!!各位看官觉得有用就收藏、点赞、评论一下吧。我看到问题后,我会第一时间回复的!