2016-07-13 5 views
0

Tomcat 8にWebアプリケーションがデプロイされています。特定のユーザーが各アプリケーションを使用している時間を追跡したいと思います。つまり、効果的にシステム内で作業している時間です。特定のユーザーが実際に自分のアプリケーションを使用している時間を特定するにはどうすればよいですか?

このような機能はTomcatには既に存在しますか?

Tomcatのでは、私はすでに使用済み時間非アクティブ時間Tomcat Manager applicationに利用可能であることを見ることができますが、は使用時間は私が探しているものではありません。それは単に減算作成時間最後にアクセスされた時間は、「セッションの総有効期間」を示します。

ユーザーの実際の使用時間を確認するにはどうすればよいですか?

+0

ここに記載されている解決策を使用する必要があります:http://stackoverflow.com/a/26427149/5655414その時点で行う必要があるのは、現在の時刻をログアウトするだけです。それはあなたが探しているものですか? – angryip

答えて

0

Filterを使用して、各要求の時刻を記録し、その時刻をユーザーの集計使用時間に加算するとします。すでに利用可能なセッションがあると仮定して、ユーザーのHttpSessionにそれを保存することができます。

セッションに保存するだけでセッションが終了すると、ユーザーの累積使用時間が失われることに注意してください。セッションの有効期限を過ぎても情報が保持されるようにするには、ディスク上のファイルやリレーショナルデータベースなどの他の場所で使用時間を書き込む必要があります。

上記のコメントの@angryipはFilterの良い例ですが、リクエストを実際に実行する方法の良い例ではありません。 FilterdoFilterメソッドは非常に簡単です。このようなもの:

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) 
    throws IOException, ServletException 
{ 
    HttpSession session = null; 

    if(request instanceof HttpServletRequest) 
     session = ((HttpServletRequest)request).getSession(false); 

    // Start the clock 
    long elapsed = System.currentTimeMillis(); 

    // Use try/finally because the request can throw an exception; 
    // We still want to capture the usage-time even if an error 
    // occurs. 
    try { 
     chain.doFilter(request, response); 
    } finally { 
     // Stop the clock 
     elapsed = System.currentTimeMillis() - elapsed; 

     // Store the cumulative usage time in the session 
     if(null != session) { 
      Long usage = (Long)session.getAttribute("usage"); 
      if(null != usage) 
       elapsed = elapsed + usage.getLong(); 
      session.setAttribute("usage", Long.valueOf(elapsed)); 
     } 
    } 
} 

セッションの情報を取得するのはあなた次第です。 JMXを使用してその識別子でセッションを要求し、次に "usage"という引数を指定して "getAttribute"を呼び出すことでそれを観察できます。

+0

ありがとうございます。しかし、より多くの1つの質問。このフィルタは、オーバーロードされたアプリケーションから離れることはできませんか?私はTomCatに何か準備ができていると思った。 –

+0

いいえ、Tomcatはこれのようなものを何も供給しません。いったんビルドされると、この 'Filter'を任意のアプリケーションで使用することができますが、使用情報が' HttpServlet'に格納されているので、複数のアプリケーション間での使用を集約するために信頼性をもって使用することはできません。使用状況情報を他の場所に保存する場合は、「ユーザー」が誰であるかを把握できる限り、任意の数のアプリケーションから使用時間を集計できます。 –

関連する問題