質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

java1.8&tomcat7のセッション有効期限について setMaxInactiveInterval

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,859
退会済みユーザー

退会済みユーザー

以下のコードを記述し、sessionを常に保持したいですが、

HttpSession session = request.getSession();
session.setMaxInactiveInterval(-1);

上記をローカルmac/tomcat7で実装していますが、
1日たった後でmacを再起動しましたが、

コード中で、session.setAttribute("key", key);

したkeyが

session.getAttribute("key");

で取得できなくなります。

この原因は、tomcat セッションはデフォルトは、メモリに保持しているので、
macを再起動してしまう、または、tomcatを再起動してしまうと、
メモリから消えてしまい、セッションも消えてしまうになりますでしょうか。

また、セッションを切れなくするには、以下のようにファイルに保存する形で
よいでしょうか。

http://qiita.com/shintaness/items/73d176c0a4f369608898#2-2

何卒教えて頂ければ幸いです。

--追記--
context.xmlにある以下にて

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->


「Tomcat停止時にセッション状態をファイルに保存して、起動時に読み込んでセッションを永続化するようになってます」

という動作をするとのことなので、

少なくとも、tomcat起動、再起動では、セッション情報は消えないになりますかね。

だとしますと、私がmacを再起動したときに、
tomcatの停止しないまましたので、強制終了になり、セッションが保存されないままとなったため、
セッションがきえてしまったという現象になった?でしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

http://tomcat.apache.org/tomcat-6.0-doc/config/manager.html#Special_Features

Whenever Apache Tomcat is shut down normally and restarted, or when an application reload is triggered, the standard Manager implementation will attempt to serialize all currently active sessions to a disk file located via the pathname

とあります。"shut down normally"でなければ、セッションは永続化されないと読めますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/14 10:32

    ご回答ありがとうございます。
    勉強になります。

    キャンセル

0

以下、記述誤りがありましたので訂正しました。

セッションの有効期限を -1 にした場合は、開いているブラウザが閉じられた瞬間に"ブラウザのクッキーが"破棄され、Tomcatのセッションオブジェクトそのものは破棄されません。

同一ブラウザで開いたときは同一のセッションクッキーが使われ、ブラウザを閉じたときは、ブラウザ側のクッキーが破棄されたので次は新しいセッションが発行されます
(つまりお調べになったとおり、セッションオブジェクトそのものは残ります)

なお、Tomcat停止→起動してもブラウザが残っている(ないしは同一のセッションIDでリクエストした)
ことに関しては、

<Manager pathname="" />


を有効にすると、Tomcatを停止した後はセッションはすべて破棄されます。つまりデフォルトの設定ではTomcatを再起動してもセッションオブジェクトは復活しようと試みます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/05 13:59

    ご回答ありがとうございます。

    1点下記教えていただいた部分について、

    >セッションの有効期限を -1 にした場合は、開いているブラウザが閉じられた瞬間に破棄されます。

    -1の場合、ブラウザが閉じられてもセッションは有効であると思いまして、
    実際プログラムを動かしてみましたところ、セッションは有効でありました。


    そうなりますと、、sessionを常に保持したい場合は、
    setMaxInactiveInterval(-1);とする。

    また、これまでを纏めますと、
    (1)tomcat再起動でもセッションは生き残る
    (2)ブラウザ再起動でもセッションは生き残る
    (3)tomcatが乗っかているマシンを再起動する際、
       tomcatを停止してから再起動をしていれば、セッションの復帰できるが、
       tomcatを停止せずに再起動すると、セッションが保存されずにきえてしまう場合がある。

    になる理解でよいでしょうか。






    キャンセル

  • 2016/06/06 11:55

    ご回答ありがとうございます。

    となりますと、すみません、以下認識だけあっていますでしょうか。

    sessionを常に保持したい場合は、setMaxInactiveInterval(-1);として、

    (1)tomcat再起動でもセッションは生き残る
    (2)ブラウザ再起動でもセッションは生き残る
    (3)tomcatが乗っかているマシンを再起動する際、
       tomcatを停止してから再起動をしていれば、セッションの復帰できるが、
       tomcatを停止せずに再起動すると、セッションが保存されずにきえてしまう場合がある。

    キャンセル

  • 2016/06/06 13:43

    "セッションを常に保持する"(ないしはセッションそのもの?)が少し曖昧でしょうか。

    (1)setMaxInactiveInterval(-1)を指定したときは、セッションへ格納したオブジェクトとセッションIDはTomcatに残ります。
    (2)ブラウザを全て閉じた後にふたたび同じアプリケーションを実行したときには、別のセッションIDが発行されますので、もし前のセッションを復帰したい場合は、Tomcatの標準設定であればセッションIDをクッキーを使って指定します。
    (3)のTomcatを停止せずにOSを再起動の意味、で話をしますが、それに関してはセッション情報をファイルへ出力している場合は復帰できますが、OS停止→Tomcatのサービス強制停止した場合は正しく保存できていない可能性もあります。

    キャンセル

  • 2016/06/06 14:12

    ご回答ありがとうございます。

    理解が合っているか確認ですが、
    setMaxInactiveInterval(-1)とした場合において、aという情報をセッションに残したら、その後、サーバー再起動、ブラウザ再起動にかかわらず、何回でもaという情報が取り出せる。
    ただし、強制終了があった場合は、取り出せなくなる場合がある。
    で良いでしょうか。





    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る