From c182fcd103121ffe6919e3c30d83e9f69cbe2ac5 Mon Sep 17 00:00:00 2001 From: "Michelle.Chung" <1242874891@qq.com> Date: Mon, 25 Dec 2023 19:18:50 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=9B=B4=E6=96=B0=20THREAD=5FLOCAL=20?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=20;=20update=20=E6=9B=B4=E6=96=B0=20RepeatSu?= =?UTF-8?q?bmitAspect=20=E6=96=B9=E6=B3=95=E4=BB=A5=E9=98=B2=E5=BC=BA?= =?UTF-8?q?=E8=BD=AC=E6=8A=A5=E9=94=99=20;=20update=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20ResourcesConfig=20=E6=8B=A6=E6=88=AA=E5=99=A8=E9=87=8D?= =?UTF-8?q?=E5=86=99=E6=96=B9=E6=B3=95=E5=88=A0=E9=99=A4=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BC=93=E5=AD=98=20;=20delete=20=E5=88=A0=E9=99=A4=20UserInfo?= =?UTF-8?q?Interceptor=20;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/context/ThreadLocalHolder.java | 9 ++- .../aspectj/RepeatSubmitAspect.java | 6 +- .../security/config/SecurityConfig.java | 64 +++++++++++-------- .../common/web/config/ResourcesConfig.java | 3 - .../web/interceptor/UserInfoInterceptor.java | 27 -------- 5 files changed, 47 insertions(+), 62 deletions(-) delete mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/UserInfoInterceptor.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java index fcce72af6..4ee72832b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/context/ThreadLocalHolder.java @@ -11,9 +11,14 @@ import java.util.Map; public class ThreadLocalHolder { /** - * 初始化 + * 初始化 (支持异步) */ - private static final ThreadLocal> THREAD_LOCAL = ThreadLocal.withInitial(HashMap::new); + private static final ThreadLocal> THREAD_LOCAL = new InheritableThreadLocal<>() { + @Override + protected Map initialValue() { + return new HashMap<>(); + } + }; /** * 设置值 diff --git a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java index 0945b631f..553d0db6e 100644 --- a/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java +++ b/ruoyi-common/ruoyi-common-idempotent/src/main/java/org/dromara/common/idempotent/aspectj/RepeatSubmitAspect.java @@ -83,7 +83,8 @@ public class RepeatSubmitAspect { if (r.getCode() == R.SUCCESS) { return; } - RedisUtils.deleteObject((String) ThreadLocalHolder.get(KEY_CACHE)); + String cacheKey = ThreadLocalHolder.get(KEY_CACHE); + RedisUtils.deleteObject(cacheKey); } finally { ThreadLocalHolder.remove(KEY_CACHE); } @@ -98,7 +99,8 @@ public class RepeatSubmitAspect { */ @AfterThrowing(value = "@annotation(repeatSubmit)", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, RepeatSubmit repeatSubmit, Exception e) { - RedisUtils.deleteObject((String) ThreadLocalHolder.get(KEY_CACHE)); + String cacheKey = ThreadLocalHolder.get(KEY_CACHE); + RedisUtils.deleteObject(cacheKey); ThreadLocalHolder.remove(KEY_CACHE); } diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java index 4f2530a4b..ace0668e3 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/org/dromara/common/security/config/SecurityConfig.java @@ -4,6 +4,8 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; @@ -39,38 +41,44 @@ public class SecurityConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { // 注册路由拦截器,自定义验证规则 registry.addInterceptor(new SaInterceptor(handler -> { - AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); - // 登录验证 -- 排除多个路径 - SaRouter - // 获取所有的 - .match(allUrlHandler.getUrls()) - // 对未排除的路径进行检查 - .check(() -> { - // 检查是否登录 是否有token - StpUtil.checkLogin(); + AllUrlHandler allUrlHandler = SpringUtils.getBean(AllUrlHandler.class); + // 登录验证 -- 排除多个路径 + SaRouter + // 获取所有的 + .match(allUrlHandler.getUrls()) + // 对未排除的路径进行检查 + .check(() -> { + // 检查是否登录 是否有token + StpUtil.checkLogin(); - // 检查 header 与 param 里的 clientid 与 token 里的是否一致 - String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); - String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); - String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); - if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { - // token 无效 - throw NotLoginException.newInstance(StpUtil.getLoginType(), - "-100", "客户端ID与Token不匹配", - StpUtil.getTokenValue()); - } + // 检查 header 与 param 里的 clientid 与 token 里的是否一致 + String headerCid = ServletUtils.getRequest().getHeader(LoginHelper.CLIENT_KEY); + String paramCid = ServletUtils.getParameter(LoginHelper.CLIENT_KEY); + String clientId = StpUtil.getExtra(LoginHelper.CLIENT_KEY).toString(); + if (!StringUtils.equalsAny(clientId, headerCid, paramCid)) { + // token 无效 + throw NotLoginException.newInstance(StpUtil.getLoginType(), + "-100", "客户端ID与Token不匹配", + StpUtil.getTokenValue()); + } - // 保存用户信息 - ThreadLocalHolder.set(LoginHelper.LOGIN_USER_KEY, LoginHelper.getLoginUser()); + // 保存用户信息 + ThreadLocalHolder.set(LoginHelper.LOGIN_USER_KEY, LoginHelper.getLoginUser()); - // 有效率影响 用于临时测试 - // if (log.isDebugEnabled()) { - // log.info("剩余有效时间: {}", StpUtil.getTokenTimeout()); - // log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); - // } + // 有效率影响 用于临时测试 + // if (log.isDebugEnabled()) { + // log.info("剩余有效时间: {}", StpUtil.getTokenTimeout()); + // log.info("临时有效时间: {}", StpUtil.getTokenActivityTimeout()); + // } - }); - })).addPathPatterns("/**") + }); + }) + { + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + ThreadLocalHolder.remove(LoginHelper.LOGIN_USER_KEY); + } + }).addPathPatterns("/**") // 排除不需要拦截的路径 .excludePathPatterns(securityProperties.getExcludes()); } diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java index 76f17b6fb..1b78ebcb8 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/ResourcesConfig.java @@ -1,7 +1,6 @@ package org.dromara.common.web.config; import org.dromara.common.web.interceptor.PlusWebInvokeTimeInterceptor; -import org.dromara.common.web.interceptor.UserInfoInterceptor; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.web.cors.CorsConfiguration; @@ -23,8 +22,6 @@ public class ResourcesConfig implements WebMvcConfigurer { public void addInterceptors(InterceptorRegistry registry) { // 全局访问性能拦截 registry.addInterceptor(new PlusWebInvokeTimeInterceptor()); - // 用户信息拦截 - registry.addInterceptor(new UserInfoInterceptor()); } @Override diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/UserInfoInterceptor.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/UserInfoInterceptor.java deleted file mode 100644 index d7881c2e0..000000000 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/interceptor/UserInfoInterceptor.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.dromara.common.web.interceptor; - -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.core.context.ThreadLocalHolder; -import org.springframework.web.servlet.HandlerInterceptor; - -/** - * 用户信息拦截器 - * - * @author Michelle.Chung - */ -@Slf4j -public class UserInfoInterceptor implements HandlerInterceptor { - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - if (ObjectUtil.isNotNull(ThreadLocalHolder.get(UserConstants.LOGIN_USER_KEY))) { - // 清除用户信息 - ThreadLocalHolder.remove(UserConstants.LOGIN_USER_KEY); - } - } - -}