JSESSIONIDはどのような条件で作成されますか?


276

JSESSIONIDが作成されるとき/条件は何ですか?

ドメインごとですか?たとえば、Tomcatアプリサーバーがあり、複数のWebアプリケーションを展開する場合、JSESSIONIDコンテキスト(Webアプリケーション)ごとに異なるものが作成されますか、それとも同じドメインである限り、Webアプリケーション間で共有されますか?

回答:


324

JSESSIONID Cookieは、セッションの作成時に作成/送信されます。セッションは、コードの呼び出し時request.getSession()またはrequest.getSession(true)初めて作成されます。セッションを取得するだけで、セッションが存在しない場合は作成しない場合は、使用してrequest.getSession(false)くださいnull。これにより、セッションまたはが返されます。この場合、新しいセッションは作成されず、JSESSIONID Cookieは送信されません。(これは、セッションが必ずしも最初のリクエストで作成されるとは限らないことを意味します... セッションが作成されると、あなたとあなたのコードが制御されます)

セッションはコンテキストごとです。

SRV.7.3セッションスコープ

HttpSessionオブジェクトのスコープは、アプリケーション(またはサーブレットコンテキスト)レベルである必要があります。セッションの確立に使用されるCookieなどの基本的なメカニズムは、異なるコンテキストで同じにすることができますが、参照されるオブジェクト(そのオブジェクトの属性を含む)は、コンテナー間でコンテキスト間で共有してはなりません。

サーブレット2.4仕様

更新:セッションがまだない場合、JSPページを呼び出すたびに暗黙的に新しいセッションが作成されます。これは、session='false'pageディレクティブでオフにできます。その場合、JSPページではセッション変数を使用できません。


2
getSessionを明示的に呼び出さずにセッションを作成できませんか?「コンテナによってコンテキスト間で共有してはならない」という点に関して、websphereにはセッションを共有するオプションがあります。これが質問の動機です:)
joshjdevl

サーブレットAPIのみを使用している場合はできません。ただし、サーバー固有の拡張機能(ご指摘のとおり、Websphereのセッション共有など)がある場合もあります。
PeterŠtibraný

<Context>タグにCookie属性が含まれている場合(たとえば、<Context cookies = "false">)には、context.xmlファイルが自動セッション作成を制御できると思います
BT

現在、フィルターを使用してセッションを作成するために多くのヒットを取得しており、2番目のヒット(2ページ目の更新ではない)が作成された後のように見えます。それは関連していますか?これが最初のリクエストで必ずしも作成されない理由の例を挙げていただけますか?ありがとう!
jpganz18

@ jpganz18:request.getSession()またはを呼び出すだけの場合request.getSession(true)、既存のセッションまたは新しいセッションのいずれかを取得します。ただし、コードがを呼び出すとrequest.getSession(false)、既存のセッションが取得されるか、セッションが存在しない場合はnullが取得されます。
PeterŠtibraný2017年

49

次に、JSESSIONIDCookieのもう1つのソースに関する情報を示します。

Tomcatサーバーで実行されるいくつかのJavaコードをデバッグしていました。request.getSession()コードのどこにも明示的に呼び出していませんでしたが、JSESSIONIDCookieがまだ設定されていることに気付きました。

最後に、Tomcatの下の作業ディレクトリにある、JSPに対応する生成されたJavaコードを確認しました。

好むと好まざるとにかかわらず、サーブレットからJSPを呼び出すJSESSIONIDと、作成されるようです。

追加:次のJSPディレクティブを追加することで、そのことがわかりました。

<%@ page session="false" %>

JSESSIONIDJSPの設定を無効にすることができます。


3
つまり、ページセッション属性のデフォルト値は「true」です。いくつかの(多くの?)ケースでどれが予期しないかもしれません。
David Bala Bic

私もtomcatを使っており、jspをまったく使用していませんが、セッションCookieはとにかく作成されます。この状況でそれを防ぐ方法はありますか?
ClassyPimp 2017年

23

修正:PeterŠtibranýの回答に投票してください-より正確で完全です!

「JSESSIONID」は、httpセッションの一意のIDです。javadocを参照してください。そこで、あなたは次の文を見つけるでしょう

セッション情報のスコープは現在のWebアプリケーション(ServletContext)のみであるため、あるコンテキストに格納された情報は別のコンテキストに直接表示されません。

したがって、最初にサイトにアクセスすると、新しいセッションが作成され、SevletContextにバインドされます。複数のアプリケーションをデプロイする場合、セッションは共有されません。

現在のセッションを無効にして、新しいセッションを作成することもできます。たとえば、httpからhttpsに切り替える場合(ログイン後)、新しいセッションを作成することをお勧めします。

これがあなたの質問に答えることを願っています。


1
セッションスコープの明確な説明。
user3123690 2014年

@Moリンクが壊れている
Timofey

8

ページに他の.jspまたは.jspf(フラグメント)が含まれている場合は注意してください。設定しない場合

<%@ page session="false" %>

それらでも、親ページは新しいセッションを開始し、JSESSIONID Cookieを設定することになります。

特に.jspfページでは、このようなスニペットを使用してweb.xmlを構成した場合に発生します。

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

内部のスクリプトレットを有効にするため。


含まれているすべてのフラグメント(.jspおよび.jspf)にページセッション= falseを設定し、残りのスニペットを含むメインのjspには含まないことを意味しますか?
Ommadawn

2

カスタムタグを使用してJSPで生成されたリンクの場合、私は使用する必要がありました

<%@ page session="false" %>

JSPで

そして

request.getSession().invalidate();

Strutsアクション

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.