2024-11-18 10:25:13 +08:00
|
|
|
package com.njcn.common.utils;
|
|
|
|
|
|
2025-02-07 14:27:54 +08:00
|
|
|
import cn.hutool.core.convert.NumberWithFormat;
|
2024-11-25 14:15:41 +08:00
|
|
|
import cn.hutool.core.date.DateUnit;
|
2024-11-18 10:25:13 +08:00
|
|
|
import cn.hutool.jwt.JWT;
|
2025-02-07 14:27:54 +08:00
|
|
|
import cn.hutool.jwt.JWTPayload;
|
2024-11-18 10:25:13 +08:00
|
|
|
import cn.hutool.jwt.JWTUtil;
|
2024-11-26 10:03:29 +08:00
|
|
|
import com.njcn.common.pojo.constant.SecurityConstants;
|
2024-11-18 10:25:13 +08:00
|
|
|
|
|
|
|
|
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 {
|
|
|
|
|
/**
|
2025-02-07 14:27:54 +08:00
|
|
|
* 一天的秒数(单位:秒)
|
2024-11-18 10:25:13 +08:00
|
|
|
*/
|
2025-02-07 14:27:54 +08:00
|
|
|
public static final long DAY_SECOND = DateUnit.DAY.getMillis() / 1000;
|
2024-11-18 10:25:13 +08:00
|
|
|
|
|
|
|
|
private final static String SECRET = "da3f9a7ad5a7d9dd5a7d9dd5a7d9d";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* jwt主题
|
|
|
|
|
*/
|
|
|
|
|
private final static String SUBJECT = "NJCN_PQS9100";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* jwt签发者
|
|
|
|
|
*/
|
|
|
|
|
private final static String JWT_ISS = "NJCN";
|
|
|
|
|
|
2025-08-05 20:33:32 +08:00
|
|
|
public static String getAccessToken(String userId,String loginName) {
|
2024-11-18 10:25:13 +08:00
|
|
|
Map<String, Object> headers = new HashMap<>();
|
|
|
|
|
headers.put("typ", "JWT");
|
|
|
|
|
headers.put("alg", "HS256");
|
|
|
|
|
Map<String, Object> payload = new HashMap<>();
|
2024-11-26 10:03:29 +08:00
|
|
|
payload.put(SecurityConstants.USER_ID, userId);
|
2025-08-05 20:33:32 +08:00
|
|
|
payload.put(SecurityConstants.Login_Name, loginName);
|
2025-03-24 16:22:19 +08:00
|
|
|
// 永不过期
|
2025-08-05 20:41:12 +08:00
|
|
|
payload.put("exp", 4910070710L);
|
2024-11-18 10:25:13 +08:00
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 15:48:31 +08:00
|
|
|
public static boolean verifyToken(String token) {
|
|
|
|
|
return JWTUtil.verify(token, SECRET.getBytes(StandardCharsets.UTF_8));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static boolean isExpired(String token) {
|
2025-02-07 14:27:54 +08:00
|
|
|
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();
|
2024-11-21 15:48:31 +08:00
|
|
|
}
|
|
|
|
|
|
2024-11-18 10:25:13 +08:00
|
|
|
public static Map<String, Object> parseToken(String token) {
|
|
|
|
|
return JWTUtil.parseToken(token)
|
|
|
|
|
.setKey(SECRET.getBytes(StandardCharsets.UTF_8))
|
|
|
|
|
.getPayload()
|
|
|
|
|
.getClaimsJson();
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-23 15:44:13 +08:00
|
|
|
public static String getRefreshToken(String token) {
|
|
|
|
|
Map<String, Object> payload = JWTUtil.parseToken(token).getPayload().getClaimsJson();
|
2025-03-24 16:22:19 +08:00
|
|
|
// 永不过期
|
|
|
|
|
payload.put("exp", Instant.now().plusSeconds(DAY_SECOND * Integer.MAX_VALUE).getEpochSecond());
|
2025-01-23 15:44:13 +08:00
|
|
|
return JWTUtil.createToken(payload, SECRET.getBytes(StandardCharsets.UTF_8));
|
|
|
|
|
}
|
2024-11-18 10:25:13 +08:00
|
|
|
}
|