【问题标题】:How to maintain session attributes in a multitenant architecture?如何在多租户架构中维护会话属性?
【发布时间】:2013-05-14 12:11:17
【问题描述】:

对于 SaaS 应用程序,同一台服务器托管多个应用程序。会话属性如何维护?详细说明问题: AppA 和 AppB 托管在同一台机器上,我现在为 AppA 创建 UserA,为 AppB 创建 UserB。 AppA 和 AppB 属于不同的组织,因此它们没有关联。有关用户的一些详细信息存储在 http 会话级别(直到会话超时)。因此,现在如果我使用不同的选项卡从同一浏览器同时登录 AppA 和 AppB,我最终可能会在 UserB/AppB 屏幕上看到一些 UserA/AppA 详细信息,反之亦然。如何解决这样的问题? 我能想到的一种解决方案是创建像 appa.example.org 和 appb.example.org 这样的子域。还有其他/更好的方法吗?

【问题讨论】:

  • 如果应用属于不同的组织,是否会存在可以从同一个浏览器访问的真实场景
  • @JoseK 是的,会有的。这些应用程序确实属于不同的组织,但它们可以通过 Internet 访问,而不仅仅是在组织的内部网络中。如果用户同时注册了这两个组织,他们可能会同时打开它们。

标签: java tomcat multi-tenant


【解决方案1】:

通常您不会在另一个应用中看到一个应用的详细信息。

创建会话时,它会在 Web 应用程序内部创建并由密钥标识。这个 session-id 是存储在 cookie 中或以其他方式传递的内容,用于识别在下一个请求中引用哪个 session 对象。

如果您将此会话 ID 显示给另一个 Web 应用程序,它将找不到属性,因为它们存在于另一个 Web 应用程序中。

现在,这是“通常”。实际上,这可以在各个方向进行配置,例如将所有属性存储在 cookie 中(在极端故障转移场景中非常有用),将会话存储在共享的 memcached 层或共享数据库表中(然后您将在另一个中获取相同的对象当然是应用程序)等等。

【讨论】:

  • 也许我不清楚,这两个“应用程序”在同一个网络应用程序上,它们提供相同的功能,但针对不同的组织。由于浏览器会为现有域找到 cookie,因此它总是发送相同的 cookie,包括打开两个不同的选项卡时。​​span>
  • 我认为这个问题的答案解释了这一点:stackoverflow.com/questions/595872/…
【解决方案2】:

我想出的最佳解决方案是受到this question 的启发。我已经将多个上下文指向同一个战争文件:

<Service ...>
    <Engine ...>
        <Host ... autoDeploy="false">
            <Context docBase="myapp.war" path="/tenant1"/>
            <Context docBase="myapp.war" path="/tenant2"/>
        </Host>
    </Engine>
</Service>

这与制作 myapp.war 的副本基本相同,称为tenant1.war、tenant2.war 等。每个租户在技术上都在运行他们自己的 webapp,即使它们都运行相同的代码。 如果您的用户拥有两个或多个租户的凭据,他们可以同时登录到这两个租户,并且每个 webapp 将获得自己的会话,因为包含会话 ID 的 JSESSIONID cookie 每个都绑定到特定的上下文路径。

这种方法有缺点。一方面,war 文件中的所有类都会为每个租户重新加载,所以我必须密切关注 PermGen 空间。另一方面,每次有新租户出现时,我都必须编辑 server.xml。您找到更好的解决方案了吗?

【讨论】:

  • 我添加了一个间接级别。我所有的(Spring)控制器都扩展了一个 BaseController,它公开了一个方法,如 Context getContext(tenant){ 如果租户在会话中有一个上下文,检查最后一次访问时间是否在租户会话超时内,否则清理旧的上下文,如果有的话,并创建一个新上下文,更新访问时间,将应用服务器会话超时更新为会话中所有租户的最大值并返回}。上下文只是字符串、对象的映射。所有其他 servlet/controllers/jsps 读取/写入上下文而不是会话。
  • 租户名称本身来源于请求的 URL。 URL 类似于host/warname/tenantname/resource.htm
猜你喜欢
  • 2013-11-27
  • 2014-08-28
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2015-08-25
  • 2014-11-16
  • 1970-01-01
  • 2011-05-25
相关资源
最近更新 更多