Bladeren bron

Update 优化 在请求拦截处设置动态租户,切换动态租户

切换全局租户需要手动传参
YueYunyun 1 jaar geleden
bovenliggende
commit
7246e82cc1

+ 20 - 19
SERVER/VberAdminPlusV3/vber-common/vber-common-tenant/src/main/java/com/vber/common/tenant/helper/TenantHelper.java

@@ -1,18 +1,15 @@
 package com.vber.common.tenant.helper;
 
-import cn.dev33.satoken.context.SaHolder;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import com.alibaba.ttl.TransmittableThreadLocal;
 import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
 import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
 import com.vber.common.core.constant.GlobalConstants;
-import com.vber.common.core.utils.ServletUtils;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.redis.utils.RedisUtils;
 import com.vber.common.satoken.utils.LoginHelper;
-import jakarta.servlet.http.HttpServletRequest;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -90,35 +87,43 @@ public class TenantHelper {
         if (!isEnable()) {
             return null;
         }
-        if (notLogin()) {
+        if (isNotLogin()) {
             return TEMP_DYNAMIC_TENANT.get();
         }
-        String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
-        String tenantId = (String) SaHolder.getStorage().get(cacheKey);
+        // 如果线程内有值 优先返回
+        String tenantId = TEMP_DYNAMIC_TENANT.get();
         if (StringUtils.isNotBlank(tenantId)) {
             return tenantId;
         }
+        String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
         tenantId = RedisUtils.getCacheObject(cacheKey);
-        SaHolder.getStorage().set(cacheKey, tenantId);
         return tenantId;
     }
 
     /**
-     * 设置动态租户(一直有效 需要手动清理)
+     * 设置动态租户
      * <p>
      * 如果为未登录状态下 那么只在当前线程内生效
      */
     public static void setDynamic(String tenantId) {
+        setDynamic(tenantId, false);
+    }
+
+    /**
+     * 设置动态租户
+     * <p>
+     * 如果为未登录状态下 那么只在当前线程内生效
+     */
+    public static void setDynamic(String tenantId, boolean isGlobal) {
         if (!isEnable()) {
             return;
         }
-        if (notLogin()) {
+        if (isNotLogin() || !isGlobal) {
             TEMP_DYNAMIC_TENANT.set(tenantId);
             return;
         }
         String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
         RedisUtils.setCacheObject(cacheKey, tenantId);
-        SaHolder.getStorage().set(cacheKey, tenantId);
     }
 
     /**
@@ -128,13 +133,12 @@ public class TenantHelper {
         if (!isEnable()) {
             return;
         }
-        if (notLogin()) {
+        if (isNotLogin()) {
             TEMP_DYNAMIC_TENANT.remove();
             return;
         }
         String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
         RedisUtils.deleteObject(cacheKey);
-        SaHolder.getStorage().delete(cacheKey);
     }
 
     /**
@@ -173,12 +177,8 @@ public class TenantHelper {
             return null;
         }
         String tenantId = "";
-        // 请求头获取的租户id优先级最高
-        HttpServletRequest request = ServletUtils.getRequest();
-        if (request != null) {
-            tenantId = request.getHeader(GlobalConstants.TENANT_ID_HEADER);
-        }
-        // 其次动态租户优先
+
+        // 动态租户优先
         if (StringUtils.isBlank(tenantId)) {
             tenantId = TenantHelper.getDynamic();
         }
@@ -188,7 +188,8 @@ public class TenantHelper {
         return tenantId;
     }
 
-    private static boolean notLogin() {
+
+    private static boolean isNotLogin() {
         try {
             StpUtil.checkLogin();
             return false;

+ 6 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-web/pom.xml

@@ -25,6 +25,11 @@
             <artifactId>vber-common-redis</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.vap</groupId>
+            <artifactId>vber-common-tenant</artifactId>
+        </dependency>
+
         <!-- SpringBoot Web容器 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -61,6 +66,7 @@
             <groupId>com.alibaba</groupId>
             <artifactId>transmittable-thread-local</artifactId>
         </dependency>
+
     </dependencies>
 
 </project>

+ 7 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-web/src/main/java/com/vber/common/web/interceptor/PlusWebInvokeTimeInterceptor.java

@@ -3,9 +3,11 @@ package com.vber.common.web.interceptor;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.map.MapUtil;
 import com.alibaba.ttl.TransmittableThreadLocal;
+import com.vber.common.core.constant.GlobalConstants;
 import com.vber.common.core.utils.SpringUtils;
 import com.vber.common.core.utils.StringUtils;
 import com.vber.common.json.utils.JsonUtils;
+import com.vber.common.tenant.helper.TenantHelper;
 import com.vber.common.web.filter.RepeatedlyRequestWrapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -36,7 +38,11 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         if (!prodProfile.equals(SpringUtils.getActiveProfile())) {
             String url = request.getMethod() + " " + request.getRequestURI();
-
+            // 请求头获取到租户id,设置动态租户
+            String tenantId = request.getHeader(GlobalConstants.TENANT_ID_HEADER);
+            if (!StringUtils.isBlank(tenantId)) {
+                TenantHelper.setDynamic(tenantId);
+            }
             // 打印请求参数
             if (isJsonRequest(request)) {
                 String jsonParam = "";

+ 1 - 1
SERVER/VberAdminPlusV3/vber-modules/vber-system/src/main/java/com/vber/system/controller/system/SysTenantController.java

@@ -144,7 +144,7 @@ public class SysTenantController extends BaseController {
     @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @GetMapping("/dynamic/{tenantId}")
     public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
-        TenantHelper.setDynamic(tenantId);
+        TenantHelper.setDynamic(tenantId, true);
         return R.ok();
     }