• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Tomcat上でのSessionの値の取得)

Tomcat上でのSessionの値の取得

このQ&Aのポイント
  • Tomcat上でのSessionの値の取得について詳しく教えてください。
  • 他のプログラムからTomcat上で動作しているWebコンテンツのSessionの値を参照することは可能でしょうか?
  • Tomcat上でのSession値の取得についてセキュリティについても教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 http://blog.goo.ne.jp/peugeot307hdi/e/afe55f317eba8d5570c65741e69fc75e こちらが参考になりますか? 簡単にやるならスタティックなMapにセッションIDをキーにして書き込んでおいてバッチでそのMapの中身を利用してDBに書き込むとかでしょうか。 リアルタイムな書き込みじゃ駄目なのでしょうか。負荷が高いとか?(ようはセッションをDBで扱うイメージ) メモリ上にデータを残すということは、Tomcatが落ちると消えてしまいます。

miyamura200000
質問者

お礼

早速のご回答ありがとうございます。 教えていただいたURLを参考にやってみます。 ちょっとすぐには検証できないですが・・・・ リアルタイムの更新は負荷を気にして避けようとしています。 前にチェックした時間から一定時間後のみDB更新という方法も考えてはいますが、 それだと本当の最終アクセス時間がとれなくなってしまう。 Tomcatが落ちた場合は仕方がないと諦めるつもりです。 今のバージョンにしてからは落ちたことがないことと、 最悪更新できなくても致命傷になるほどではないので。 更新できなくても致命傷にならない⇔精度の高い最終アクセス時間の書き込み と若干矛盾してはいるんですが、異常のない状態で出来る限りのことをやろうと思っています。

miyamura200000
質問者

補足

教えていただいたURLを参考に実現できました。 ありがとうございます。

その他の回答 (2)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.3

Sessionが重要でないなら、作りこみは避けたほうが良いです。 蛇足ですが、Ans2の方の案をそのまま採用すると、 アプリの起動・停止と並列化に影響します。

miyamura200000
質問者

お礼

ご回答ありがとうございます。 代替え案もないわけではないので、Sessionを読み込むことをやめることも 選択の一つだとは思っております。 ご指摘ありがとうございました。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

 こんなのはどうだろう。コンテキストリスナーでWebアプリ起動時にスレッドを作り、Webアプリ終了時にスレッドを終了する。セッションリスナーでセッションの作成時にリストに加え、破棄時にリストからも破棄する。後はスレッドを10秒に一回回してリスト中の全セッションを操作する事ができる。これはあくまでサンプルなのでこのままでは使えない。  これをweb.xmlに登録すると、Webアプリ実行中は10秒ごとに全セッションを回して情報を読み書きできる。深夜1回なら、次回実行時刻を記録して10秒ごとに実行時刻が来たら実行して次回実行時刻を1日後ろにするといった対応が必要だ。 ~~~~ サンプルリスナー ~~~~ package net.example.javax.servlet; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import jp.co.syous.psn.lunch.common.action.LunchActionSupport; import jp.co.syous.psn.lunch.common.action.LunchLoginInfo; public class SampleSessionListener extends Thread implements ServletContextListener, HttpSessionListener, Runnable { private List<HttpSession> sessionList = new ArrayList<HttpSession>(); private boolean loop = true; @Override public void sessionCreated(HttpSessionEvent hse) { this.sessionList.add(hse.getSession()); } @Override public void sessionDestroyed(HttpSessionEvent hse) { try { this.sessionList.remove(hse.getSession()); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { while (this.loop) { for (HttpSession session : this.sessionList) { if (session == null) { continue; } // TODO ここで全セッションに対して最終アクセス時間をDBに書き込む } try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); this.loop = false; } } } @Override public void contextDestroyed(ServletContextEvent sce) { this.loop = false; try { this.join(); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void contextInitialized(ServletContextEvent sce) { this.start(); } }

miyamura200000
質問者

お礼

ご回答ありがとうございます。 No.3の回答の方がこの実装方法には問題があるとご指摘くださってますので、 今回は見送りさせてもらうことになると思います。 技術的には何かしらの参考になるとは思いますので、 何かの機会に活かせればと思います。

関連するQ&A