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