diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java index fc52dac8..4a7362a3 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java @@ -1,6 +1,8 @@ package cn.dev33.satoken.listener; -import java.util.Date; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.stp.SaLoginModel; @@ -50,8 +52,9 @@ public class SaTokenListenerForConsolePrint implements SaTokenListener { */ @Override public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { - Date date = new Date(System.currentTimeMillis() + disableTime * 1000); - println("账号[" + loginId + "] " + service + " 服务被封禁,封禁等级=" + level + " (解封时间: " + SaFoxUtil.formatDate(date) + ")"); + Instant instant = Instant.ofEpochMilli(System.currentTimeMillis() + disableTime * 1000); + ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault()); + println("账号[" + loginId + "] " + service + " 服务被封禁,封禁等级=" + level + " (解封时间: " + SaFoxUtil.formatDate(zonedDateTime) + ")"); } /** diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java index b7cb7545..d20cbca7 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java @@ -4,6 +4,8 @@ import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -109,6 +111,15 @@ public class SaFoxUtil { public static String formatDate(Date date){ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); } + + /** + * 将日期格式化 (yyyy-MM-dd HH:mm:ss) + * @param zonedDateTime 日期 + * @return 格式化后的时间 + */ + public static String formatDate(ZonedDateTime zonedDateTime) { + return zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } /** * 从集合里查询数据 diff --git a/sa-token-doc/doc/api/stp-util.md b/sa-token-doc/doc/api/stp-util.md index c3132c4a..e7f3e5b2 100644 --- a/sa-token-doc/doc/api/stp-util.md +++ b/sa-token-doc/doc/api/stp-util.md @@ -47,9 +47,9 @@ StpUtil.logout(); // 会话注销 StpUtil.logout(10001); // 会话注销,根据账号id StpUtil.logout(10001, "PC"); // 会话注销,根据账号id 和 设备类型 StpUtil.logoutByTokenValue(token); // 指定 Token 强制注销 -StpUtil.kickout(10001); // 踢人下线 -StpUtil.kickout(10001, "PC"); // 踢人下线,根据账号id -StpUtil.kickoutByTokenValue(token); // 踢人下线,根据账号id 和 设备类型 +StpUtil.kickout(10001); // 踢人下线,根据账号id +StpUtil.kickout(10001, "PC"); // 踢人下线,根据账号id 和 设备类型 +StpUtil.kickoutByTokenValue(token); // 踢人下线,根据token ``` @@ -152,7 +152,7 @@ StpUtil.searchTokenSessionId(keyword, start, size, sortType); // 根据条件 ### 11、账号封禁 ``` java -StpUtil.disable(10001, 1200); // 封禁:指定账号 +StpUtil.disable(10001, 1200); // 封禁:指定账号 指定时间(单位s) StpUtil.isDisable(10001); // 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁) StpUtil.checkDisable(10001); // 校验:指定账号是否已被封禁,如果被封禁则抛出异常 `DisableServiceException` StpUtil.getDisableTime(10001); // 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) @@ -160,9 +160,9 @@ StpUtil.untieDisable(loginId); // 解封:指定账号 ``` -### 12、分类封禁 +### 12、分类封禁 (version >= 1.31.0) ``` java -StpUtil.disable(10001, "<业务标识>", 86400); // 封禁:指定账号的指定服务 +StpUtil.disable(10001, "<业务标识>", 86400); // 封禁:指定账号的指定服务 指定时间(单位s) StpUtil.isDisable(10001, "<业务标识>"); // 判断:指定账号的指定服务 是否已被封禁 (true=已被封禁, false=未被封禁) StpUtil.checkDisable(10001, "<业务标识>"); // 校验:指定账号的指定服务 是否已被封禁,如果被封禁则抛出异常 `DisableServiceException` StpUtil.getDisableTime(10001, "<业务标识>"); // 获取:指定账号的指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁) @@ -170,7 +170,7 @@ StpUtil.untieDisable(loginId, "<业务标识>"); // 解封:指定账号的 ``` -### 13、阶梯封禁 +### 13、阶梯封禁 (version >= 1.31.0) ``` java StpUtil.disableLevel(10001, "comment", 3, 10000); // 分类阶梯封禁,参数:封禁账号、封禁服务、封禁级别、封禁时间 StpUtil.getDisableLevel(10001, "comment"); // 获取:指定账号的指定服务 封禁的级别 (如果此账号未被封禁则返回 -2) diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java index a25175f3..4c2f9404 100644 --- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java +++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java @@ -1,8 +1,10 @@ package cn.dev33.satoken.core.util; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; import org.junit.jupiter.api.Assertions; @@ -51,8 +53,10 @@ public class SaFoxUtilTest { @Test public void formatDate() { - String formatDate = SaFoxUtil.formatDate(new Date(1644328600364L)); - Assertions.assertEquals(formatDate, "2022-02-08 21:56:40"); + Instant instant = Instant.ofEpochMilli(1644328600364L); + ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai")); + String formatDate = SaFoxUtil.formatDate(zonedDateTime); + Assertions.assertEquals(formatDate, "2022-02-08 21:56:40"); } @Test