package com.youlai.boot.common.tenant; import lombok.extern.slf4j.Slf4j; /** * 租户上下文工具类 *

* 使用 ThreadLocal 存储当前线程的租户ID,确保线程安全 *

* * @author Ray.Hao * @since 3.0.0 */ @Slf4j public class TenantContextHolder { /** * 租户ID线程本地变量 */ private static final ThreadLocal TENANT_ID_HOLDER = new ThreadLocal<>(); /** * 忽略租户标志(用于某些场景下临时跳过租户过滤) */ private static final ThreadLocal IGNORE_TENANT_HOLDER = new ThreadLocal<>(); /** * 设置当前租户ID * * @param tenantId 租户ID */ public static void setTenantId(Long tenantId) { if (tenantId != null) { TENANT_ID_HOLDER.set(tenantId); log.debug("设置当前租户ID: {}", tenantId); } } /** * 获取当前租户ID * * @return 租户ID,如果未设置则返回 null */ public static Long getTenantId() { return TENANT_ID_HOLDER.get(); } /** * 设置忽略租户标志 * * @param ignore 是否忽略 */ public static void setIgnoreTenant(boolean ignore) { IGNORE_TENANT_HOLDER.set(ignore); log.debug("设置忽略租户标志: {}", ignore); } /** * 是否忽略租户 * * @return true-忽略,false-不忽略 */ public static boolean isIgnoreTenant() { Boolean ignore = IGNORE_TENANT_HOLDER.get(); return ignore != null && ignore; } /** * 清除当前线程的租户上下文 *

* 必须在请求结束时调用,避免线程池复用导致的数据泄露 *

*/ public static void clear() { TENANT_ID_HOLDER.remove(); IGNORE_TENANT_HOLDER.remove(); log.debug("清除租户上下文"); } }