对于SaaS应用程序,同一服务器将主机托管到多个应用程序。如何维护会话属性?详细说明问题: AppA和AppB托管在同一台机器上,我现在为AppA创建UserA,为AppB创建UserB。 AppA和AppB属于不同的组织,因此它们没有链接。有关用户的一些详细信息存储在http会话级别(直到会话超时)。所以现在如果我使用不同的选项卡从同一浏览器登录AppA和AppB,我可能最终会在UserB / AppB屏幕上看到一些UserA / AppA详细信息,反之亦然。如何解决这样的问题? 我能想到的一个解决方案是创建appa.example.org和appb.example.org等子域。还有其他/更好的方式吗?
答案 0 :(得分:1)
通常,您不会在另一个应用中看到一个应用的详细信息。
创建会话时,会在Web应用程序内创建会话并通过密钥进行标识。此会话ID是存储在cookie中的,或以其他方式传递以识别在下一个请求中引用哪个会话对象。
如果您将此会话ID提供给其他网络应用,则无法找到属性,因为它们位于其他网络应用中。
现在,这是'通常'。在实践中,这可以在所有方向上配置,例如将所有属性存储在cookie中(在极端故障转移方案中非常有用),将会话存储在共享的memcached层或共享数据库表中(然后您将在另一个中获取相同的对象)课程的应用),等等。
答案 1 :(得分:1)
我提出的最佳解决方案受到this question的启发。我已经将多个上下文指向同一个war文件:
<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每个都绑定到特定的上下文路径。 / p>
这种方法有缺点。首先,war文件中的所有类都会为每个租户重新加载,因此我将不得不关注PermGen空间。另一方面,每次新租户出现时我都要编辑server.xml。你找到了更好的解决方案吗?