11

異なるポートを使用して、1台のサーバーで2つの異なるWebアプリを実行している状況があります。どちらもJavaのJettyサーブレットコンテナを実行しているため、どちらもJSESSIONIDという名前のCookieパラメータを使用してセッションIDを追跡します。これらの2つのWebアプリは、セッションIDをめぐって争っています。

  • Firefoxタブを開き、WebApp1に移動します
  • WebApp1のHTTP応答には、JSESSIONID=1のset-cookieヘッダーがあります
  • Firefoxには、WebApp1へのすべてのHTTPリクエストにJSESSIONID=1のCookieヘッダーが含まれるようになりました。
  • 2番目のFirefoxタブを開き、WebApp2に移動します
  • WebApp2へのHTTP要求にも、JSESSIONID = 1のCookieヘッダーがありますが、doGetで呼び出すreq.getSession(false);と、取得しnullます。そして、呼び出すreq.getSession(true)と、新しいSessionオブジェクトが取得されますが、WebApp2からのHTTP応答には、JSESSIONID=20のset-cookieヘッダーがあります。
  • これで、WebApp2には動作中のセッションがありますが、WebApp1のセッションはなくなりました。WebApp1にアクセスすると、新しいセッションが表示され、WebApp2のセッションが吹き飛ばされます。
  • 永遠に続く

そのため、セッションは各Webアプリ間でスラッシングしています。req.getSession(false)すでにJSESSIONIDCookieが定義されている場合は、が有効なセッションを返すようにしたいと思います。

1つのオプションは、基本的にHashMapとWEBAPP1SESSIONIDおよびWEBAPP2SESSIONIDと呼ばれるCookieを使用してSessionフレームワークを再実装することですが、それは残念であり、新しいSessionのものをActionServletや他のいくつかの場所にハックする必要があります。

これは他の人が遭遇した問題であるに違いありません。桟橋はHttpServletRequest.getSession(boolean)ただのくだらないですか?

4

6 に答える 6

3

同様の問題がありました。異なるポートのローカルホスト上の同じアプリケーションの1つ以上のインスタンスが、アプリケーションの開始時に選択され、それぞれが独自のjettyインスタンスを使用しています。

しばらくして、私はこれを思いついた:

  • 突堤が初期化するのを待つ
  • jettyのSocketManagerを使用してポートを取得します(socketManager.getLocalPort()
  • SessionManagerを介してCookie名を設定します(sessionHandler.getSessionManager().setSessionCookie(String)

このようにして、インスタンスごとに異なるCookie名を使用できるため、干渉がなくなります。

于 2010-06-09T15:29:36.400 に答える
3

これはJettyの問題ではなく、Cookieの仕様がどのように定義されたかです。名前と値のペアに加えて、Cookieには、有効期限、パス、ドメイン名、およびCookieが安全であるかどうか(つまり、SSL接続のみを対象とする)が含まれる場合があります。ポート番号は上記にリストされていません;-)したがって、stepanchegが彼の回答で述べているように、パスまたはドメインのいずれかを変更する必要があります。

于 2009-07-18T11:39:35.753 に答える
3

この例ではTomcatを使用しているため、解決策はインスタンスごとに異なるセッションCookie名を使用することです。

のようcontext.xmlなことをする

<Context sessionCookieName="JSessionId_8080">
于 2015-10-23T20:07:47.600 に答える
1

私は掘り下げていましたが、に、AbstractSessionManagerと呼ばれるメソッドがあることがわかりましたgetCrossContextSessionIDs()。が返される場合true、新しいセッションを作成するときに、Jettyは最初にJSESSIONIDが設定されているかどうかを確認し、その既存のセッションIDを使用しようとします。true起動時に何らかのJavaプロパティを使用するように値を設定できると思います。

さらに掘り下げてみると、これは、同じJettyの異なるコンテキスト(したがって、クロスコンテキスト)で2つのWebアプリを実行している場合にのみ役立ちます。Session新しいオブジェクトを作成すると、新しいJSESSIONID値が選択されます。getCrossContextSessionIDs()を返す場合は、現在の値がこのJetty(他のすべてのコンテキストを含む)によって作成されたtrueかどうかを確認し、作成された場合は再利用します。JSESSIONID

2つの異なるポートで実行されている2つの異なるJettyインスタンスを扱っているので、そのチェックを行わないようにJettyのソースをハックするか、独自のセッションのようなフレームワークを作成する必要があります。

于 2009-07-20T15:07:44.810 に答える
0

それは正しい振る舞いです。2つのWebアプリを異なるドメインに配置することも、異なるパスで配置することもできます。

于 2009-07-17T23:35:37.200 に答える
0

jsessionidのCookieパスを設定することもできると思います。

于 2009-07-18T04:25:19.327 に答える