アプリ版:「スタンプのみでお礼する」機能のリリースについて

Tomcat上で動作しているイントラのWebのコンテンツがあります。
サービスの要件として、Sessionの有効期限は3ヶ月になっています。
このSessionの中に最終アクセス時間を保持するように作ってあります。

1日1回夜間バッチでこのSessionの最終アクセス時間をDBに書き込むように
したいと考えているのですが、そもそも他のプログラムからSessionの値を
参照することは可能なのでしょうか?

イントラのシステムであり、Sessionに持っている値には重要なものはなく、
仮にセッションジャックされても大した被害になるようなものではないので
セキュリティはそれほど意識する必要はありません。

どなたかこういったことを実現出来るかどうか、出来るならどうするかご存知の方いらっしゃいませんか?

A 回答 (3件)

こんにちは。




http://blog.goo.ne.jp/peugeot307hdi/e/afe55f317e …
こちらが参考になりますか?



簡単にやるならスタティックなMapにセッションIDをキーにして書き込んでおいてバッチでそのMapの中身を利用してDBに書き込むとかでしょうか。
リアルタイムな書き込みじゃ駄目なのでしょうか。負荷が高いとか?(ようはセッションをDBで扱うイメージ)

メモリ上にデータを残すということは、Tomcatが落ちると消えてしまいます。

この回答への補足

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

補足日時:2013/08/13 10:43
    • good
    • 0
この回答へのお礼

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

教えていただいたURLを参考にやってみます。
ちょっとすぐには検証できないですが・・・・

リアルタイムの更新は負荷を気にして避けようとしています。
前にチェックした時間から一定時間後のみDB更新という方法も考えてはいますが、
それだと本当の最終アクセス時間がとれなくなってしまう。
Tomcatが落ちた場合は仕方がないと諦めるつもりです。
今のバージョンにしてからは落ちたことがないことと、
最悪更新できなくても致命傷になるほどではないので。

更新できなくても致命傷にならない⇔精度の高い最終アクセス時間の書き込み
と若干矛盾してはいるんですが、異常のない状態で出来る限りのことをやろうと思っています。

お礼日時:2013/07/29 16:09

Sessionが重要でないなら、作りこみは避けたほうが良いです。



蛇足ですが、Ans2の方の案をそのまま採用すると、
アプリの起動・停止と並列化に影響します。
    • good
    • 0
この回答へのお礼

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

代替え案もないわけではないので、Sessionを読み込むことをやめることも
選択の一つだとは思っております。

ご指摘ありがとうございました。

お礼日時:2013/07/30 11:19

 こんなのはどうだろう。

コンテキストリスナーで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();
}
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
No.3の回答の方がこの実装方法には問題があるとご指摘くださってますので、
今回は見送りさせてもらうことになると思います。

技術的には何かしらの参考になるとは思いますので、
何かの機会に活かせればと思います。

お礼日時:2013/07/30 11:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!