SessionListenerとSessionAttributeListenerはユーザーのオンライン問題を統計する

3025 ワード

最近、ユーザーは急いでオンライン統計ユーザーリストのモジュールを必要とし、ネット上でいくつかの例を探して、大部分はSessionListenerでオンライン人数を統計して、具体的なアクセスのユーザーリストを得ることができません.試しに使ってみた
HttpSessionAttributeListenerは必要な機能を実現したが、欠点もまだ正確ではなく、統計するしかない.
しばらくの間、ユーザーのオンライン状況.
パフォーマンステストをしたことがないので、高アクセスで問題があるかどうか分かりません.
実装原理とSessionListenerとの差は多くなく、1つのリスナーがsessionを傍受することも実装されている.SessionListenerではユーザID(userId)が得られないため、私はユーザ登録にsessionを用いた.setAttribute
方法、ユーザーIDをセッションに追加し、attributeAddedメソッドを上書きしてユーザーIDをコンテナに入れ、(ここではTreeMapを使用していますが、HashMapよりも性能的に劣りますが、バックグラウンドのページングやソートに関連して、パフォーマンスを犠牲にしましょう)、attributeRemovedを上書きして終了したユーザーを削除します(もちろんプログラム終了時に呼び出す必要があります
session.removeAttribute).attributeReplacedメソッドを上書きして、私のこのサボりは直接中でまた呼び出しました
attributeAddedメソッド.
次はプライマリコードです
web.xml構成
	<listener>
	    <listener-class>com.listener.UserOnLineSessionListener</listener-class>
	</listener>

Listernerクラス
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class UserOnLineSessionListener implements HttpSessionAttributeListener {
    private static Map<Integer,String> sessions = new TreeMap<Integer,String>();
	
    public UserOnLineSessionListener(){
    	
    }  

	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		HttpSession session = event.getSession();
               //    userId  
		if ( !"userID".equals(event.getName())) return;
		Integer userId =Integer.parseInt((String)session.getAttribute("userID"));
		//      ,       
                Calendar cal = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		
		String mDateTime=sdf.format(cal.getTime());
		ServletContext application = session.getServletContext();
		if (sessions.size()==0){
			application.setAttribute("userList", sessions);
		}
		sessions.put(userId, mDateTime);
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
		if ("userID".equals(event.getName())) {
			Integer userId =Integer.parseInt((String)event.getValue());
			sessions.keySet().remove(userId);
		}
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		attributeAdded(event);
	}
	public static Map<Integer, String> getSessions() {
		return sessions;
	}

}

表示方法についてはもちろん、Mapからページングに必要なUserListオブジェクトを取り出してください