mirror of
https://github.com/continew-org/continew-starter.git
synced 2025-09-17 10:58:38 +08:00
refactor(tenant): 优化租户忽略逻辑
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -35,7 +35,7 @@ public class TenantContext {
|
|||||||
/**
|
/**
|
||||||
* 隔离级别
|
* 隔离级别
|
||||||
*/
|
*/
|
||||||
private TenantIsolationLevel isolationLevel;
|
private TenantIsolationLevel isolationLevel = TenantIsolationLevel.LINE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据源信息
|
* 数据源信息
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user