同じサーバーが複数のアプリケーションのホストとして機能するSaaSアプリケーションの場合。セッション属性はどのように維持されますか?質問を詳しく説明するために、AppAとAppBは同じマシンでホストされているので、AppA用にUserAを作成し、AppB用にUserBを作成します。AppAとAppBは異なる組織に属しているため、リンクされていません。ユーザーに関する詳細は、httpセッションレベルで保存されます(セッションがタイムアウトするまで)。したがって、異なるタブを使用して同じブラウザからAppAとAppBの両方にログインすると、UserB/AppB画面にUserA/AppAの詳細の一部が表示される場合があります。その逆の場合もあります。このような問題をどのように解決できますか?私が考えることができる1つの解決策は、appa.example.orgやappb.example.orgのようなサブドメインを作成することです。他の/より良い方法はありますか?
2 に答える
私が思いついた最良の解決策は、この質問に触発されました。同じ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を編集する必要があるということです。より良い解決策を見つけましたか?
通常、あるアプリの詳細が別のアプリに表示されることはありません。
セッションが作成されると、Web アプリケーション内で作成され、キーによって識別されます。このセッション ID は、次のリクエストで参照するセッション オブジェクトを識別するために、Cookie に保存されるか、他の方法で渡されます。
このセッション ID を別の Web アプリケーションに提示すると、属性は別の Web アプリケーションに存在するため、属性が見つかりません。
さて、それは「通常」です。実際には、これはすべての属性を Cookie に保存する (極端なフェイルオーバー シナリオで非常に便利)、共有 memcached レイヤーまたは共有データベース テーブルにセッションを保存する (その後、同じオブジェクトを別のレイヤーに戻す) など、あらゆる方向に構成できます。もちろんアプリケーション)、などなど。