refactor(tenant): 优化租户忽略逻辑

This commit is contained in:
2025-07-20 08:37:09 +08:00
parent d8c4224030
commit 35e79620e4
4 changed files with 26 additions and 23 deletions

View File

@@ -41,11 +41,14 @@ public class TenantIgnoreAspect {
@Around("@annotation(tenantIgnore)") @Around("@annotation(tenantIgnore)")
public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable { public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable {
boolean oldIgnore = TenantContextHolder.isIgnore(); boolean oldIgnore = TenantContextHolder.isIgnore();
if (oldIgnore) {
return joinPoint.proceed();
}
try { try {
TenantContextHolder.setIgnore(true); TenantContextHolder.setIgnore(true);
return joinPoint.proceed(); return joinPoint.proceed();
} finally { } finally {
TenantContextHolder.setIgnore(oldIgnore); TenantContextHolder.setIgnore(false);
} }
} }
} }

View File

@@ -35,7 +35,7 @@ public class TenantContext {
/** /**
* 隔离级别 * 隔离级别
*/ */
private TenantIsolationLevel isolationLevel; private TenantIsolationLevel isolationLevel = TenantIsolationLevel.LINE;
/** /**
* 数据源信息 * 数据源信息

View File

@@ -19,7 +19,6 @@ package top.continew.starter.extension.tenant.interceptor;
import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.annotation.AnnotationUtil;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.Ordered;
import org.springframework.web.method.HandlerMethod; import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import top.continew.starter.extension.tenant.annotation.TenantIgnore; import top.continew.starter.extension.tenant.annotation.TenantIgnore;
@@ -33,7 +32,7 @@ import top.continew.starter.extension.tenant.context.TenantContextHolder;
* @author Charles7c * @author Charles7c
* @since 2.7.0 * @since 2.7.0
*/ */
public class TenantInterceptor implements HandlerInterceptor, Ordered { public class TenantInterceptor implements HandlerInterceptor {
private final TenantProperties tenantProperties; private final TenantProperties tenantProperties;
private final TenantProvider tenantProvider; private final TenantProvider tenantProvider;
@@ -45,21 +44,11 @@ public class TenantInterceptor implements HandlerInterceptor, Ordered {
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 忽略租户拦截
if (handler instanceof HandlerMethod handlerMethod) {
TenantIgnore methodAnnotation = handlerMethod.getMethodAnnotation(TenantIgnore.class);
if (methodAnnotation != null) {
return true;
}
TenantIgnore classAnnotation = AnnotationUtil.getAnnotation(handlerMethod
.getBeanType(), TenantIgnore.class);
if (classAnnotation != null) {
return true;
}
}
// 设置上下文 // 设置上下文
String tenantId = request.getHeader(tenantProperties.getTenantIdHeader()); String tenantId = request.getHeader(tenantProperties.getTenantIdHeader());
TenantContextHolder.setContext(tenantProvider.getByTenantId(tenantId, true)); TenantContextHolder.setContext(tenantProvider.getByTenantId(tenantId, true));
// 设置是否忽略租户
TenantContextHolder.setIgnore(this.isIgnore(handler));
return true; return true;
} }
@@ -69,8 +58,20 @@ public class TenantInterceptor implements HandlerInterceptor, Ordered {
TenantContextHolder.clear(); TenantContextHolder.clear();
} }
@Override /**
public int getOrder() { * 是否忽略租户
return Integer.MIN_VALUE; *
* @param handler 处理器
* @return 是否忽略租户
*/
private boolean isIgnore(Object handler) {
if (handler instanceof HandlerMethod handlerMethod) {
TenantIgnore methodAnnotation = handlerMethod.getMethodAnnotation(TenantIgnore.class);
if (methodAnnotation != null) {
return true;
}
return AnnotationUtil.getAnnotation(handlerMethod.getBeanType(), TenantIgnore.class) != null;
}
return false;
} }
} }

View File

@@ -89,18 +89,17 @@ public class TenantUtils {
* @param runnable 业务逻辑 * @param runnable 业务逻辑
*/ */
public void executeIgnore(Runnable runnable) { public void executeIgnore(Runnable runnable) {
// 未启用租户,直接执行业务逻辑 // 未启用或忽略租户,直接执行业务逻辑
if (TenantContextHolder.isTenantDisabled()) { if (TenantContextHolder.isTenantDisabled() || TenantContextHolder.isIgnore()) {
runnable.run(); runnable.run();
return; return;
} }
boolean oldIgnore = TenantContextHolder.isIgnore();
try { try {
TenantContextHolder.setIgnore(true); TenantContextHolder.setIgnore(true);
// 执行业务逻辑 // 执行业务逻辑
runnable.run(); runnable.run();
} finally { } finally {
TenantContextHolder.setIgnore(oldIgnore); TenantContextHolder.setIgnore(false);
} }
} }
} }