JAva webリスニングシステムオンラインユーザー数(tomcat sessionの作成タイミング)

3691 ワード

Spring mvcアーキテクチャ、tomcatが実行するwebプロジェクトは、システムのオンラインユーザー数を統計する必要があります.インターネットで探した資料の多くは、HttpSessionListenerを使用してセッションの作成と破棄を傍受して実現され、セッションの作成は人数+1、セッションの破棄は人数-1、人数はサーブレットContextに格納されている.でも使っていたら、ユーザーが自主的にシステムを脱退する(関数の中でsessionを廃棄する)場合、オンラインユーザー数は変わらない.sessionがタイムアウトして自動的に期限切れになるまでオンラインユーザー数が減少する.追跡コードによると、ユーザーが自主的にシステムを脱退し、sessionが廃棄するが、ユーザーが自主的にシステムを脱退した後にログインページに再配向し、sessionは再び創立する(オンラインユーザー数-1また+1=変わらない)という意味です.ログインページになると、ログインが成功するかどうかにかかわらずセッションが作成されます.tomcatはアプリケーションがアクセスされたときにセッションを作成するのでしょうか.さらに資料を調べてみると、tomcatはアプリケーションが訪問されたときにセッションを作成するのではなく、コンテンツを動的にセッションに保存したときに作成するのではなく、呼び出しgetSession()メソッドを使用する場合、セッションが存在する場合は存在するセッションにアクセスし、存在しない場合はセッションを作成し、作成したばかりのセッションを返します.コードを調べてみるとプロジェクト中にログインページを呼び出すときにgetSession()を呼び出していくつかのロジックを行うので,ログインページに入るとユーザがまだログインしていなくてもsessionが作成され,ユーザ情報などのパラメータがまだ入っていないだけである.
結論:セッション破棄後にgetSession()を使用しないことを確保できれば、HttpSessionListenerを使用してオンラインユーザー数を統計することができ、そうでなければ、オンライン人数+1の論理はセッション作成イベントを傍受したときに行うことができず、ユーザー登録後の方法で行うことができる.コードは次のとおりです.
web.xml

	com.demo.web.UserSessionListener

UserSessionListener
package com.demo.web;

import javax.servlet.http.HttpSessionListener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;

/**
 *     session        
 * 
 *
 */
public class UserSessionListener implements HttpSessionListener {
	@Override
	public void sessionCreated(HttpSessionEvent event) {
		/**
		 *           ,         
		 * 
		 */
		/*System.out.println("   ");
		HttpSession session = event.getSession();//   Session  
		//   Session  servletcontext  
		ServletContext servletContext = session.getServletContext();
		Object object = servletContext.getAttribute("curUserNum");
		if (object == null) {
			servletContext.setAttribute("curUserNum", 1);
		} else {
			int num =(int)object;
			servletContext.setAttribute("curUserNum", num + 1);
		}*/
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent event) {
		//System.out.println("   ");
		HttpSession session = event.getSession();//   Session  
		ServletContext servletContext = session.getServletContext();
		/**
		 * 1.  num  
		 * 2. 1 
		 * 3.  servletcontext
		 * 
		 */
		Object object = servletContext.getAttribute("curUserNum");
		if (object != null){
			int num = (int) object;
			servletContext.setAttribute("curUserNum", num - 1);
		}
	}
}

ユーザーがログインに成功した後のLoginServicelet、人数増加部分:
//  ServletContext  ,    :
//                       (session      )      ,           
ServletContext sc = getServletContext();
// ServletContext            session  
HttpSession oldSession = (HttpSession) sc.getAttribute(id);
//      session       ,           session  session  
if (oldSession != null) { //             ,           session    
	if (oldSession != session) { 
		try {
			oldSession.invalidate();//  
		} catch (Throwable e) {
		}
		//   session   ServletContext ,     ID            
		sc.setAttribute(id, session); 
	}
} else{ //       session            
	sc.setAttribute(id, session); //    session  ServletContext
	
	/**
	 *      +1
	 */
	Object object = sc.getAttribute("curUserNum");
	if (object == null) {
		sc.setAttribute("curUserNum", 1);
	} else {
		int num =(int)object;
		sc.setAttribute("curUserNum", num + 1);
	}
}

システムがログアウトしたLoginoutServiceletでsession破棄操作を追加します.また、removeは、サーブレットContextに登録されているユーザーのセッションを削除します.
getServletContext().removeAttribute(Integer.toString(CurUser.getId()));
httpRequest.getSession().invalidate();

以上