很多的论坛上,我们有时候不仅仅能看到在线的人数以及登录的人数,而且还能能知道哪些用户在线,哪些用户不在线,再加上一些即时通讯工具的集成支持,这大大的方便了用户之间的相互交流,也方便了运行商对网站每天访问情况的统计以及对网站人群的统计。在Java中怎样来实现这种统计呢?方法有很多,可以统计利用session和Applaction的结合来进行统计,也可以用实时修改数据库的状态来进行实现,自己可以根据功能的强弱自己来自行设计,一般来说,我们都会使用监听器来进行实现,自己写一个监听器要实现HttpSessionListener,然后实现其方法就行了,在相应的方法中实现不同的功能。以下是一个简单的监听器:
<!---->package mj.util;
import java.util.Enumeration; import java.util.Hashtable;
import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;
/** * 实现在线用户统计的监听器 * * @author yongtree */ public class SessionListener implements HttpSessionListener {
private static Hashtable htSessionUser = new Hashtable();
/** * 构造函数 */ public SessionListener() { }
/** * @param se - * HttpSessionEvent */ public void sessionCreated(HttpSessionEvent se) {
htSessionUser.put(se.getSession().getId(), "");
}
/** * @如果登录之后,请调用此方法。 * @param sessionId * @param obj * 一般为登陆用户ID,或者登陆用户对象。此处放对象较好。 * @特别说明。如果用此形式,同一用户,同一时间多次登陆,进行判断,比较困难。最后在加一个HashTable,以账号为主键,其它相关信息为value */ public static void userLogin(String sessionId, Object obj) { htSessionUser.put(sessionId, obj); }
/** * @param se - * HttpSessionEvent */ public void sessionDestroyed(HttpSessionEvent se) { htSessionUser.remove(se.getSession().getId()); se.getSession().invalidate();
}
/** * @return Hashtable,该Hashtable的KEY含有所有会话的ID,如果该用户登录,则VALUE含有该用户的id。 */ public static Hashtable getSessionUser() { return htSessionUser; }
/** * @return int,访问当前站点的会话数。 */ public static int getSessionCount() { return htSessionUser.size(); }
/** * @return int,访问当前站点的登录会话数。 */ public static int getLoginSessionCount() { Enumeration em = htSessionUser.elements(); int i = 0; while (em.hasMoreElements()) { String sValue = (String) em.nextElement(); if (!sValue.equals("")) i++; } return i; } } | <!---->
由于时间的匆忙,很多的功能还没有实现,我会在以后的时间里继续的完善,使其功能更加的全面和更具有通用性。(更新中)