You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一域名下两个Ember应用共享Ember Data Store会话的解决方法

解决同一域名下Ember.js应用会话共享问题

你的问题核心是同一域名下两个Ember应用共享了Ember Data Store实例和Cookie,导致登录状态互通。现有Nginx配置的cookie路径规则未生效,加上Ember默认的全局Store单例特性,才引发该问题。可从以下维度修复:

1. 修正Nginx的Cookie路径代理规则

你当前的proxy_cookie_path写法有误,后端返回的Cookie路径大概率是/,需要将其替换为对应子路径,确保浏览器仅在指定路径下发送Cookie。修改后的配置如下:

location /appA {
  proxy_pass http://host1:3000;
  # 将后端Set-Cookie中的路径从/替换为/appA/
  proxy_cookie_path / /appA/;
}

location /appB {
  proxy_pass http://host2:3001;
  proxy_cookie_path / /appB/;
}

若后端设置的Cookie已有特定路径,也可使用proxy_cookie_path ~*^/ /appA/;强制替换所有路径。

2. 隔离Ember Data Store实例

Ember Data的Store默认是全局单例,同一域名下的多个应用会共享该实例。需让每个应用使用独立的Store:

  • 修改Store的单例属性:
    在每个应用的app/services/store.js中,将Store设置为非单例:

    import Store from '@ember-data/store';
    
    export default class AppAStore extends Store {
      isSingleton = false;
    }
    
  • 设置数据命名空间:
    在每个应用的config/environment.js里,给Ember Data指定唯一命名空间,让缓存和会话相关的键带上专属前缀:

    // appA的config/environment.js
    ENV['ember-data'] = {
      namespace: 'appA'
    };
    
    // appB的config/environment.js
    ENV['ember-data'] = {
      namespace: 'appB'
    };
    

3. 分离本地存储的会话数据

若你的应用使用localStorage或sessionStorage存储登录令牌(比如借助ember-simple-auth库),需为每个应用设置独立的存储键:

// appA的config/environment.js
ENV['ember-simple-auth'] = {
  localStorageKey: 'appA-session'
};

// appB的config/environment.js
ENV['ember-simple-auth'] = {
  localStorageKey: 'appB-session'
};

如果是自定义存储逻辑,也要确保每个应用的存储键前缀不同,避免数据覆盖。

4. 验证API会话隔离

由于两个应用连接同一API,需确保API能区分不同应用的会话:

  • 检查API是否依据Cookie路径或自定义请求头识别会话;
  • 若使用JWT令牌,确保每个应用的令牌存储在不同键下,请求时不会相互覆盖。

内容的提问来源于stack exchange,提问作者Torprendido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:23:12