From ea07b43ec7a1c51586131be9d6e6ebd6c513ca9b Mon Sep 17 00:00:00 2001 From: liyong <1506100524@qq.com> Date: Mon, 14 Sep 2026 13:32:28 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E4=BF=AE=E5=A4=8D=20SaResult=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=AD=97=E6=AE=B5=E6=97=B6=E7=9A=84=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E4=BF=AE=E6=94=B9=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/dev33/satoken/util/SaResult.java | 7 +++++-- .../cn/dev33/satoken/core/util/SaResultTest.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java index 48c71b21..5485a9f8 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java @@ -20,6 +20,7 @@ import cn.dev33.satoken.json.SaJsonType; import cn.dev33.satoken.SaManager; import java.io.Serializable; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; @@ -185,11 +186,13 @@ public class SaResult extends LinkedHashMap implements SaJsonTyp * @return 对象自身 */ public SaResult removeNonDefaultFields() { - for (String key : this.keySet()) { + Iterator iterator = this.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); if("code".equals(key) || "msg".equals(key) || "data".equals(key)) { continue; } - this.remove(key); + iterator.remove(); } return this; } diff --git a/sa-token-core/src/test/java/cn/dev33/satoken/core/util/SaResultTest.java b/sa-token-core/src/test/java/cn/dev33/satoken/core/util/SaResultTest.java index 0d1b2731..0b28f34c 100644 --- a/sa-token-core/src/test/java/cn/dev33/satoken/core/util/SaResultTest.java +++ b/sa-token-core/src/test/java/cn/dev33/satoken/core/util/SaResultTest.java @@ -119,6 +119,20 @@ public class SaResultTest { Assertions.assertEquals(200, defaultsOnly.getCode()); Assertions.assertEquals("ok", defaultsOnly.getMsg()); Assertions.assertEquals("data", defaultsOnly.getData()); + + // 存在多个非默认字段时,不应抛出 ConcurrentModificationException + SaResult withExtras = SaResult.get(200, "ok", "data") + .set("extra1", "x") + .set("extra2", "y") + .set("extra3", "z"); + withExtras.removeNonDefaultFields(); + Assertions.assertEquals(3, withExtras.size()); + Assertions.assertEquals(200, withExtras.getCode()); + Assertions.assertEquals("ok", withExtras.getMsg()); + Assertions.assertEquals("data", withExtras.getData()); + Assertions.assertFalse(withExtras.containsKey("extra1")); + Assertions.assertFalse(withExtras.containsKey("extra2")); + Assertions.assertFalse(withExtras.containsKey("extra3")); } /** ok/data/notLogin/notPermission/empty 等静态工厂方法应返回预期状态码 */ -- Gitee