多租户环境下fetch域名切换核心是动态构造URL:通过子域名拼接或请求头注入租户标识,封装tenant-aware fetch工厂函数,并注意CORS与credentials配置。

在多租户环境下,fetch 的域名切换核心是**动态构造请求 URL**,而非硬编码 baseURL。关键在于把租户标识(如 subdomain、header、path prefix)与业务逻辑解耦,并确保每次请求都携带正确的租户上下文。
通过子域名动态拼接 URL
适用于租户以子域名隔离的场景(如 tenant1.example.com、tenant2.example.com)。需在发起 fetch 前从当前 URL、用户登录态或全局配置中提取租户 ID:
- 从 location.host 提取子域名:
const tenant = location.host.split('.')[0](注意处理 www、localhost 等边界情况) - 拼接完整 URL:
const url = `https://${tenant}.api.example.com/v1/users` - 直接传入 fetch:
fetch(url, { method: 'GET' })
通过请求头传递租户标识
适用于统一网关入口、后端通过 header(如 X-Tenant-ID)路由的架构。此时主域名固定,租户信息由 header 携带:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 确保租户 ID 可被安全获取(例如从 auth token payload 或内存缓存中读取)
- 在 fetch options 中注入 header:
headers: { 'X-Tenant-ID': tenantId, 'Content-Type': 'application/json' } - 避免在 URL 中暴露租户 ID,提升安全性与一致性
封装通用 fetch 工厂函数
避免每个请求重复判断租户逻辑,推荐封装一个 tenant-aware fetch:
立即学习“Java免费学习笔记(深入)”;
- 定义工厂函数:
const createTenantFetch = (tenantContext) => (input, init) => { /* 插入租户逻辑 */ return fetch(url, options) } - tenantContext 可来自 React Context、Pinia store 或全局变量,支持运行时切换
- 内部自动处理 URL 重写或 header 注入,业务层调用仍保持简洁:
tenantFetch('/users')
注意跨域与凭证配置
域名切换后,CORS 和 credentials 行为会变化:
- 若子域名不同(a.example.com → b.example.com),默认不共享 Cookie,需显式设置
credentials: 'include' - 确保后端 CORS 响应头允许对应租户域名:
Access-Control-Allow-Origin: https://tenant1.example.com - 避免使用
'*'配合 credentials,会导致浏览器拒绝请求

















