From 8c65df86fcb2487d731a97f6b4737428a4def526 Mon Sep 17 00:00:00 2001 From: nyb <2905154974@qq.com> Date: Mon, 22 Sep 2025 11:04:23 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E9=98=B2=E9=87=8D=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=B7=BB=E5=8A=A0=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E5=A4=84=E7=90=86=E7=9C=9F=E6=AD=A3=E7=9A=84=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SameUrlDataInterceptor.java | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java index 316a370c13..c05e2c909e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -65,23 +65,37 @@ public class SameUrlDataInterceptor extends RepeatSubmitInterceptor // 唯一标识(指定key + url + 消息头) String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; - Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); - if (sessionObj != null) - { - Map sessionMap = (Map) sessionObj; - if (sessionMap.containsKey(url)) - { - Map preDataMap = (Map) sessionMap.get(url); - if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) - { - return true; + // 使用原子操作检查并设置,避免竞态条件 + String lockKey = cacheRepeatKey + "_lock"; + + // 先尝试获取分布式锁,防止并发问题 + Boolean lockResult = redisCache.redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 1, TimeUnit.SECONDS); + if (lockResult == null || !lockResult) { + // 获取锁失败,说明有并发请求,直接返回重复提交 + return true; + } + + try { + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + + if (sessionObj != null) { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) { + return true; + } } } + + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } finally { + // 释放锁 + redisCache.deleteObject(lockKey); } - Map cacheMap = new HashMap(); - cacheMap.put(url, nowDataMap); - redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); - return false; } /** -- Gitee