package com.njcn.common.utils; import cn.hutool.core.convert.NumberWithFormat; import cn.hutool.core.date.DateUnit; import cn.hutool.jwt.JWT; import cn.hutool.jwt.JWTPayload; import cn.hutool.jwt.JWTUtil; import com.njcn.common.pojo.constant.SecurityConstants; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.HashMap; import java.util.Map; /** * @author caozehui * @data 2024/11/18 */ public class JwtUtil { /** * 一天的秒数(单位:秒) */ public static final long DAY_SECOND = DateUnit.DAY.getMillis() / 1000; private final static String SECRET = "da3f9a7ad5a7d9dd5a7d9dd5a7d9d"; /** * jwt主题 */ private final static String SUBJECT = "NJCN_PQS9100"; /** * jwt签发者 */ private final static String JWT_ISS = "NJCN"; public static String getAccessToken(String userId,String loginName) { Map headers = new HashMap<>(); headers.put("typ", "JWT"); headers.put("alg", "HS256"); Map payload = new HashMap<>(); payload.put(SecurityConstants.USER_ID, userId); payload.put(SecurityConstants.Login_Name, loginName); // 永不过期 payload.put("exp", 4910070710L); payload.put("sub", SUBJECT); payload.put("iss", JWT_ISS); payload.put("iat", Instant.now().getEpochSecond()); return JWTUtil.createToken(headers, payload, SECRET.getBytes(StandardCharsets.UTF_8)); } public static boolean verifyToken(String token) { return JWTUtil.verify(token, SECRET.getBytes(StandardCharsets.UTF_8)); } public static boolean isExpired(String token) { JWT jwt = JWT.of(token).setKey(SECRET.getBytes(StandardCharsets.UTF_8)); JWTPayload payload = jwt.getPayload(); NumberWithFormat exp = (NumberWithFormat) payload.getClaim("exp"); long currentTime = Instant.now().getEpochSecond(); return currentTime > exp.longValue(); } public static Map parseToken(String token) { return JWTUtil.parseToken(token) .setKey(SECRET.getBytes(StandardCharsets.UTF_8)) .getPayload() .getClaimsJson(); } public static String getRefreshToken(String token) { Map payload = JWTUtil.parseToken(token).getPayload().getClaimsJson(); // 永不过期 payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * Integer.MAX_VALUE).getEpochSecond()); return JWTUtil.createToken(payload, SECRET.getBytes(StandardCharsets.UTF_8)); } }