From 09c3dd956544ce2157091483f34aed445283b07b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 3 Mar 2023 21:58:42 +0800 Subject: [PATCH] fix bug --- .../impl/TemporalAccessorConverter.java | 11 +++- .../core/date/format/GlobalCustomFormat.java | 6 ++ .../cn/hutool/json/convert/JSONConverter.java | 14 ++++- .../main/java/cn/hutool/json/jwt/Claims.java | 3 +- .../cn/hutool/json/jwt/IssueI6IS5BTest.java | 55 +++++++++++++++++++ 5 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 hutool-json/src/test/java/cn/hutool/json/jwt/IssueI6IS5BTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java index af481448c..fbbb2f926 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java @@ -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); } /** diff --git a/hutool-core/src/main/java/cn/hutool/core/date/format/GlobalCustomFormat.java b/hutool-core/src/main/java/cn/hutool/core/date/format/GlobalCustomFormat.java index 8fdc29d93..b80b6adb5 100755 --- a/hutool-core/src/main/java/cn/hutool/core/date/format/GlobalCustomFormat.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/format/GlobalCustomFormat.java @@ -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> formatterMap; diff --git a/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java index 253258b0a..5e82f329a 100644 --- a/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/convert/JSONConverter.java @@ -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; diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java index 8ff46020e..af10857ce 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java @@ -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; diff --git a/hutool-json/src/test/java/cn/hutool/json/jwt/IssueI6IS5BTest.java b/hutool-json/src/test/java/cn/hutool/json/jwt/IssueI6IS5BTest.java new file mode 100644 index 000000000..e2de93d70 --- /dev/null +++ b/hutool-json/src/test/java/cn/hutool/json/jwt/IssueI6IS5BTest.java @@ -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; + } +}