2016-05-25 8 views
0

ウェブアプリケーションでセッション数をカウントするためにSessionListenerを実装しました。私はsetMaxInterval(60)と私の問題は次のとおりです:セッションが期限切れの場合、セッションカウンタは0に設定され、再びWebページ上をナビゲートし始めると、セッションカウンタは増加しません。何故なの?Java/JSP/Sessions

public class SessionListener implements HttpSessionListener { 

static int counter = 0; 

public void sessionCreated(HttpSessionEvent e) 
{ 
    HttpSession s = e.getSession(); 

    s.setMaxInactiveInterval(60); 

    counter++; 

    synchronized(s.getServletContext()) 
    { 
     s.getServletContext().setAttribute("allConnections", counter); 

    } 
} 

public void sessionDestroyed(HttpSessionEvent e) 
{ 
    HttpSession s = e.getSession(); 

    counter--; 

    synchronized(s.getServletContext()) 
    { 
     s.getServletContext().setAttribute("allConnections", counter); 
    } 


} 

はその後、各JSPはセッション固有のオブジェクトのカウンタ変数は、(あなたは属性としてセッションオブジェクトに格納しているためであるapplication.getAttribute("allConnections")

+0

を大幅により正確に答えることに役立つだろう。 –

+1

元のコードが私に役立ちました。私はデバッグ行を追加してコンソールに出力しました。私は2つの方法でカウンターの価値を印刷しました。また、非アクティブ間隔を6秒に変更しました。そうすれば、コンソールを見て、カウンターがすぐに上下に移動するのを見ることができます。デスクトップ上に3種類のブラウザ(IE、Chrome、Firefox)を使用しました。あなたのコードは大丈夫です。 – rickz

+0

私はあなたのコードを別の方法で1つのブラウザでテストしました。それはうまく動作します。私は私のデスクトップ上でJSPへのショートカットを作った。私はそのページを閲覧し、すぐにブラウザをシャットダウンしました。私は同じことを何度も繰り返しました。 – rickz

答えて

1

でフロントエンド上のカウンタ変数を表示します- カウンタをアプリケーションコンテキスト/スコープ(またはそのスコープにあるシングルトンオブジェクト)に入れます。 - カウンタ変数を静的にしますリスナー)

質問の更新後に編集 セッションが作成されると、セッション属性が1回設定されます。つまり、初期値(セッションが作成されたときに適用可能なもの)のみが任意のセッションに対して表示されます。

カウンタを表示するページを表示する各リクエストで値を読み取る必要があります。あなたはこのためにいくつかのオプションがあります:あなたは、更新カウンタを設定し、フィルタを追加することができます:あなたはSessionListenerクラスの静的ゲッターを提供できるかどう

  • JSP /サーブレットは、直接
  • より良い値を読み取ることができます要求スコープの属性として使用します。カウンタを表示する各リクエスト(jsp、servletなど)でフィルタが実行されるようにするだけです。 JSPのロード
+0

私はリクエストされたサンプルを提供しました。 – freestar

+0

残念ながら、属性はコンテキストスコープに格納されます。私は本当に何がうまくいかないのか分からない。 – freestar

+0

答えを更新しました。フィルターを表示する前に、フィルターを提示するか、値を毎回読み取るようにしてください。 –

0

たりしないことがあり、このディレクティブの値に応じてセッションを作成することがあります。あなたのコードからスニペットを表示

<%@ page session="false" %>