なぜWARはセッション情報を共有できないのですか?


11

複数の開発者がこの問題の解決策を探しているのを見てきました:異なるWARからのセッション情報へのアクセス(同じEAR内であっても)-ここにいくつかのサンプルがあります:Tomcatの異なるアプリケーション間でセッション状態を共有する方法はありますか?別のWebアプリケーションのアクセスセッション異なるWARファイル、共有リソースTomcat:2つのアプリケーション間でデータを共有する方法 TomcatでcrossContext属性は何をしますか?セッション共有を有効にしますか?等々...

私が検索したすべてから、コンテナに応じていくつかの特定の解決策がありますが、それはどういうわけか「仕様に反しています」。また、答えを見つけることができずにJava EE仕様を調べました。

一部の開発者はWebアプリケーション間のカップリングについて話しますが、私は反対する傾向があります。カップリングしない場合、同じEAR内にWARを保持する理由は何ですか?たとえば、EJBはローカルにアクセスできます(同じEAR内の別のEJB JAR内にある場合でも)。

より具体的には、私のWARの1つが認証と許可を処理し、この情報を(同じEAR内の)他のWARと共有したいと思います。以前、WARをJARとしてパッケージ化し、それらを単一のWARプロジェクト(WEB-INF / lib)に入れることで、同様の問題を回避することができました。しかし、私はこのソリューションが好きではありません(サーブレットの命名などに多大な労力が必要です)。

そして、最初の(そして最も重要な)質問に答えるソリューションはありませんなぜWARはセッション情報を共有できないのですか?


1
SOに適している可能性があること以外は、なぜこれがダウン投票されたかはわかりません。
NateDSaint

3
「サーブレット2.3 API仕様に従って、セッションマネージャーはWebモジュールによるセッションスコープのみをサポートします。特定のセッションに関連付けられたデータにアクセスできるのは、同じWebモジュール内のサーブレットのみです。」これはHttpSessionで再び見ることができます-「セッション情報のスコープは現在のWebアプリケーション(ServletContext)のみであるため、1つのコンテキストに保存された情報は別のコンテキストに直接表示されません。」-これは仕様に反します。

(のためのより良い、現在のリンクのHttpSession

@MichaelT、ありがとう。しかし、それでも理由はわかりません。
rvcoutinho

@NateDSaint質問は特定の技術に関連していますが、概念的な質問である可能性が高いと考えました。次に、プログラマーに決めました。
rvcoutinho

回答:


7

EARを擬似仮想マシンのように扱う

EARは、通常はJARからの共通の構成とライブラリを共有するWARファイルのコレクションです。これにより、相互依存するサービスのコレクションをアプリケーションコンテナ内でより簡単に管理できます。したがって、EARをコンテナーにデプロイすると、EARは仮想マシンの単純な形式と考えることができます。

仮想マシン上の1つのプロセスが別のプロセスに影響を与えることができないのと同じ方法で、EARにも同じことが言えます。すべてのWARは、内部状態を保護するために分離されています。

スケーリング認証

一般に、Webアプリケーションは、適切に拡張するためにステートレスである必要があります。セッションに多くの情報があることは、これを防ぐアンチパターンです。これにより、HTTPのステートレスな性質と、迅速でカスタマイズされたユーザーエクスペリエンスを維持する必要性との間に矛盾が生じます。認証は古典的なユースケースであり、エンドユーザー機能を提供するために多くの認証されたリクエストを必要とするおしゃべりなAPIで一般的です。

シングルサインオンとシングルサインオフは、特に水平スケーリングが適切に行われている場合、正しく機能するために慎重なシグナリングが必要です(部分的なサインオフを考慮してください)。セッション状態を単に共有することはほとんど良い解決策ではなく、より良いアプローチは、クラスター内のすべてのノードがアクセスできるユーザー情報に単一の参照ポイントを使用することです。

関連情報への高速キャッシュアクセスに集中すると、複雑で脆弱なセッション共有ソリューションよりもはるかにスケーラブルな結果が得られます。


ありがとう、@ GaryRowe。これは私が探していた答えです。とにかく、開発者が決めることはできませんか?
rvcoutinho

別の質問:JBoss Cacheは良い解決策になると思いますか?Apache Shiro(およびそのセッションクラスタリング)について聞いたことがありますか?どう?
rvcoutinho

@rvcoutinhoアプリケーション開発者は、Linuxカーネルでプロセスを管理する方法を決定しますか?それは質問の似たような枠組みです-はい、あなたはそれを行うことができますが、それは非常に困難になるだろうし、おそらくあなたは代替パスを取るよりもあなたに多くの痛みを引き起こすでしょう。
ゲイリーロウ

2
@rvcoutinho私はApache Shiro(別名Apache Security)を使用していませんが、共有セキュリティ問題の良い解決策になると思います。同じことを達成するために独自のプロトコルを展開するのではなく、OpenIDとOAuth2との統合を検討してください。JBoss Cacheは、やや複雑に見えるInfinispanに置き換わる行き止まりでの独自の承認によるものです。あなたはを見てみたいかもしれない十二ファクターAppサイトに簡単よりスケーラブルなソリューションを垣間見るために。
ゲイリーロウ

2

JEE EAR仕様の機能、つまりEAR内でバインドされた複数のWebアーカイブ間でWebセッションを共有する機能が欠けていると思います。

Weblogicなどのアプリケーションサーバーには、この機能の標準以外の実装があります。


これが私の意見でした。上記の選択が行われた理由を理解しようとしていました。
rvcoutinho

1

まあ、AFAIKS、あなたがこれをしたい本当の理由はありません。WARは自己完結型のWebアプリケーションであり、独自の(Webアプリケーション固有の)スコープ(セッションスコープなど)を持ちます。複数のWAR間で機能(Javaコード、JSPページ、CSSファイル)を共有する必要がある場合は、それらをJARファイルとしてパッケージ化し、アプリケーションサーバーにデプロイするはるかに賢明なオプションがあります。WARパッケージはより複雑なパッケージ化ソリューションであり、単純な「共通のコード/機能」とは異なる何かをカプセル化するように設計されています。JARはより単純な形式であり、コードと機能をパッケージ化および共有するために設計されています。よりシンプルでより適したパッケージ形式が既に利用できるのに、より複雑で具体的には設計されていないパッケージを使用して何かを共有したいのはなぜですか。


仰るとおりです。しかし、それは一般的なリソースに限られます。ただし、シングルサインオンアプリケーションの場合、セッション固有の情報(ログに記録されたユーザーに関する情報)を共有する必要があります。そして、これが仕様に反する理由は見当たりません。
rvcoutinho

2
セッションスコープは、異なるアプリケーション間で現在のユーザーデータを共有するために作成されていないためです。また、SSOはセッションスコープ属性の検査以上のものを意味するためです。戦争の外でコードを作成してパッケージ化することができます(戦争に依存せず、戦争に依存する)、必要に応じてセッションスコープ属性にアクセスします(フィルターなど)が、より良いソリューションは私見ですauthを処理し、他の(戦争で展開された)アプリケーションへのアクセスを許可する、別個のファサードアプリケーションまたはサーバー構成を持つ。
シヴァンドラゴン

私は再びあなたに同意します。しかし、JavaEE仕様(JAASを使用)は、HttpSessionの一部としてユーザー情報を保持しますが、これはこのアプローチとは対照的です。代わりにShiro(直交セッションを維持する)を使用することを検討してきた理由の1つ。
rvcoutinho

とにかく、対応してくれてありがとう。私の質問に対する決定的な答えはまだありませんが、あなたが言ったことはすべて関連しています。+1
rvcoutinho

@rvcoutinhoよく、それは問題に関する私の意見です、申し訳ありませんが、それはあなたにとってそれ以上役に立ちませんでした。
シヴァンドラゴン

0

これは、異なるWebアプリがお互いのセッション情報を誤って上書きするのを避けるために、意図的に行われたと思います。あなたの場合は便利かもしれませんが、一般に、ユーザーが同時に2つのWebアプリを使用しているという理由だけで、ユーザーにアプリをクラッシュさせたり特権を昇格させたりすることは望ましくありません。Webアプリ間で明示的に情報を共有することは必ずしも難しくありません。静的なHashMapでクラスを作成し、GUIDをキーとして使用し、URLまたはHTTPパラメーターの一部として転送します。


ありがとう。実際、すべてのアプリケーション間でセッション全体を共有することではなく、必要に応じて特定のセッション情報(ユーザー情報として)について話していました。たぶん私ははっきりしていませんでした。より明確にするための提案はありますか?
rvcoutinho
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.