This commit is contained in:
Looly 2023-03-03 21:58:42 +08:00
parent cf8c890e8d
commit 09c3dd9565
5 changed files with 85 additions and 4 deletions

View File

@ -3,6 +3,7 @@ package cn.hutool.core.convert.impl;
import cn.hutool.core.convert.AbstractConverter;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.format.GlobalCustomFormat;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ObjUtil;
@ -156,7 +157,15 @@ public class TemporalAccessorConverter extends AbstractConverter {
return IsoEra.of(Math.toIntExact(time));
}
return parseFromInstant(targetClass, Instant.ofEpochMilli(time), null);
final Instant instant;
if(GlobalCustomFormat.FORMAT_SECONDS.equals(this.format)){
// https://gitee.com/dromara/hutool/issues/I6IS5B
// Unix时间戳
instant = Instant.ofEpochSecond(time);
}else{
instant = Instant.ofEpochMilli(time);
}
return parseFromInstant(targetClass, instant, null);
}
/**

View File

@ -18,7 +18,13 @@ import java.util.function.Function;
*/
public class GlobalCustomFormat {
/**
* 格式秒时间戳Unix时间戳
*/
public static final String FORMAT_SECONDS = "#sss";
/**
* 格式毫秒时间戳
*/
public static final String FORMAT_MILLISECONDS = "#SSS";
private static final Map<CharSequence, Function<Date, String>> formatterMap;

View File

@ -6,14 +6,24 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.convert.ConvertException;
import cn.hutool.core.convert.Converter;
import cn.hutool.core.convert.RegisterConverter;
import cn.hutool.core.convert.impl.*;
import cn.hutool.core.convert.impl.ArrayConverter;
import cn.hutool.core.convert.impl.CollectionConverter;
import cn.hutool.core.convert.impl.DateConverter;
import cn.hutool.core.convert.impl.MapConverter;
import cn.hutool.core.convert.impl.TemporalAccessorConverter;
import cn.hutool.core.map.MapWrapper;
import cn.hutool.core.reflect.ConstructorUtil;
import cn.hutool.core.reflect.TypeReference;
import cn.hutool.core.reflect.TypeUtil;
import cn.hutool.core.text.StrUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.json.*;
import cn.hutool.json.InternalJSONUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONException;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.json.serialize.JSONDeserializer;
import cn.hutool.json.serialize.JSONString;

View File

@ -1,6 +1,7 @@
package cn.hutool.json.jwt;
import cn.hutool.core.codec.BaseN.Base64;
import cn.hutool.core.date.format.GlobalCustomFormat;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.json.JSONConfig;
@ -21,7 +22,7 @@ public class Claims implements Serializable {
private static final long serialVersionUID = 1L;
// 时间使用秒级时间戳表示
private final JSONConfig CONFIG = JSONConfig.of().setDateFormat("#sss");
private final JSONConfig CONFIG = JSONConfig.of().setDateFormat(GlobalCustomFormat.FORMAT_SECONDS);
private JSONObject claimJSON;

View File

@ -0,0 +1,55 @@
package cn.hutool.json.jwt;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.Date;
/**
* https://gitee.com/dromara/hutool/issues/I6IS5B
*/
public class IssueI6IS5BTest {
@Test
public void payloadToBeanTest() {
final LocalDateTime iat = TimeUtil.of(DateUtil.parse("2023-03-03"));
final JwtToken jwtToken = new JwtToken();
jwtToken.setIat(iat);
final String token = JWTUtil.createToken(JSONUtil.parseObj(jwtToken), "123".getBytes(StandardCharsets.UTF_8));
Assert.assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.SXU_mm1wT5lNoK-Dq5Y8f3BItv_44zuAlyeWLqajpXg", token);
final JSONObject payloads = JWTUtil.parseToken(token).getPayloads();
Assert.assertEquals("{\"iat\":1677772800}", payloads.toString());
final JwtToken o = payloads.toBean(JwtToken.class);
Assert.assertEquals(iat, o.getIat());
}
@Data
static class JwtToken {
private LocalDateTime iat;
}
@Test
public void payloadToBeanTest2() {
final Date iat = DateUtil.parse("2023-03-03");
final JwtToken2 jwtToken = new JwtToken2();
jwtToken.setIat(iat);
final String token = JWTUtil.createToken(JSONUtil.parseObj(jwtToken), "123".getBytes(StandardCharsets.UTF_8));
Assert.assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2Nzc3NzI4MDB9.SXU_mm1wT5lNoK-Dq5Y8f3BItv_44zuAlyeWLqajpXg", token);
final JSONObject payloads = JWTUtil.parseToken(token).getPayloads();
Assert.assertEquals("{\"iat\":1677772800}", payloads.toString());
final JwtToken2 o = payloads.toBean(JwtToken2.class);
Assert.assertEquals(iat, o.getIat());
}
@Data
static class JwtToken2 {
private Date iat;
}
}