1

だから私は簡単なセッションリスナーを作りました-ウェブ上にはたくさんあります:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
class SessionListener implements ServletContextListener, HttpSessionListener {

    private static final int MAX_INACTIVE_INTERVAL = 1000; // in secs
    // static AtomicInteger numOfSessions;
    // singleton ? static ?
    static int numOfSessions;
    static ServletContext context;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        se.getSession().setMaxInactiveInterval(MAX_INACTIVE_INTERVAL);
        increase();
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        decrease();
    }

    private synchronized void increase() {
            ++numOfSessions;
            context.setAttribute("numberOfSessions", numOfSessions);
            System.out.println("SessionListener - increase - numberOfSessions = " +
                               numOfSessions);
    }

    private synchronized void decrease() {
            --numOfSessions;
            context.setAttribute("numberOfSessions", numOfSessions);
            System.out.println("SessionListener - decrease - numberOfSessions = " +
                               numOfSessions);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("SessionListener - contextDestroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        context = sce.getServletContext();
        System.out.println("SessionListener - contextInitialized : " +
                           context);
    }
}

_heavily_edited_

私はEclipseJunoのGlassfish3.1.2を使用しています。セッションは、関連するサーブレットrequest.getSession()のメソッドを介して作成されます。doPost()プロジェクトを再デプロイすると(保存時に)decrease()呼び出されます-セッションは自然に無効になります。

現在、 Eclipse glassfishプラグインでは「再デプロイ全体でセッションを保持」がデフォルトでオンになっているため、プロジェクトを再びEclipseに保存して再デプロイすると、次のようになります。

INFO: SessionListener - decrease - numberOfSessions = -1

意味:GFはセッションを再作成しますが、リスナーを呼び出しません-したがって、再展開時にセッションは無効になります-しかし、sessionCreated()呼び出されなかったため、セッションカウントは0になります。

これに対する回避策が必要です!

歴史的(何が起こっているのかを理解するのに役立ちました):

tomcatを実行しているJavaプログラムを変更して再コンパイルすると、tomcatは最初にセッションリスナーを呼び出してすべてのセッションを削除し、次に同じセッションIDで新しいセッションオブジェクトを再作成し、シリアル化できないオブジェクト以外のすべての属性を編集します(?) / edit、ただし、今回は、これを行うときに登録済みのセッションリスナーを呼び出しません。

注意:セッションの保存については何も知りませんでしたが、セッションが完全に保存されていなかったため(POJOセッション属性が消滅しました-保存するにはシリアル化可能である必要があることを理解しています-そうですか?ドキュメント?)何を理解するのに本当に時間がかかりました起こっていました。

4

0 に答える 0