0

同じサーバーが複数のアプリケーションのホストとして機能するSaaSアプリケーションの場合。セッション属性はどのように維持されますか?質問を詳しく説明するために、AppAとAppBは同じマシンでホストされているので、AppA用にUserAを作成し、AppB用にUserBを作成します。AppAとAppBは異なる組織に属しているため、リンクされていません。ユーザーに関する詳細は、httpセッションレベルで保存されます(セッションがタイムアウトするまで)。したがって、異なるタブを使用して同じブラウザからAppAとAppBの両方にログインすると、UserB/AppB画面にUserA/AppAの詳細の一部が表示される場合があります。その逆の場合もあります。このような問題をどのように解決できますか?私が考えることができる1つの解決策は、appa.example.orgやappb.example.orgのようなサブドメインを作成することです。他の/より良い方法はありますか?

4

2 に答える 2

1

私が思いついた最良の解決策は、この質問に触発されました。同じwarファイルに複数のコンテキストを指定しました:

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

これは基本的に、tenant1.war、tenant2.warなどと呼ばれるmyapp.warのコピーを作成することと同じです。各テナントは、すべて同じコードを実行していても、技術的には独自のWebアプリケーションを実行しています。2つ以上のテナントに資格情報を持つユーザーがいる場合、ユーザーは両方に同時にログオンでき、セッションIDを含むJSESSIONID Cookieはそれぞれ特定のコンテキストパスに関連付けられているため、各Webアプリは独自のセッションを取得します。

このアプローチには欠点があります。1つは、warファイル内のすべてのクラスがテナントごとに再ロードされるため、PermGenスペースを監視する必要があります。もう1つは、新しいテナントが登場するたびにserver.xmlを編集する必要があるということです。より良い解決策を見つけましたか?

于 2012-06-07T16:05:49.363 に答える
1

通常、あるアプリの詳細が別のアプリに表示されることはありません。

セッションが作成されると、Web アプリケーション内で作成され、キーによって識別されます。このセッション ID は、次のリクエストで参照するセッション オブジェクトを識別するために、Cookie に保存されるか、他の方法で渡されます。

このセッション ID を別の Web アプリケーションに提示すると、属性は別の Web アプリケーションに存在するため、属性が見つかりません。

さて、それは「通常」です。実際には、これはすべての属性を Cookie に保存する (極端なフェイルオーバー シナリオで非常に便利)、共有 memcached レイヤーまたは共有データベース テーブルにセッションを保存する (その後、同じオブジェクトを別のレイヤーに戻す) など、あらゆる方向に構成できます。もちろんアプリケーション)、などなど。

于 2010-09-02T09:18:33.790 に答える