最近用户急要一个在线统计用户列表的模块,在网上搜了些例子,大部分都是用SessionListener统计在线人数的,无法得到具体访问的用户列表。尝试了一下用
HttpSessionAttributeListener实现了需要的功能,缺点也还是不很准确,只能统计
一段时间内用户的在线情况。
没有做过性能测试,不知道这样在高访问量下会不会有什么问题。
实现原理和SessionListener差不多,也是实现一个监听器监听session,由于在SessionListener无法得到用户ID(userId),我在用户登录是用了session.setAttribute
方法,把用户ID添加到session中,覆盖attributeAdded方法得到用户ID放到容器里,(我这里用的是TreeMap,性能上要比HashMap差点,但涉及后台的分页和排序,就牺牲点性能吧),覆盖attributeRemoved 删除退出的用户(当然程序退出时要调用
session.removeAttribute).覆盖attributeReplaced方法,我这偷懒直接在里面又调用了
attributeAdded方法。
下面是主要代码
web.xml配置
Listerner类
关于怎么显示就不用多说了,从Map里面取出分页需要的UserList对象就可以了
HttpSessionAttributeListener实现了需要的功能,缺点也还是不很准确,只能统计
一段时间内用户的在线情况。
没有做过性能测试,不知道这样在高访问量下会不会有什么问题。
实现原理和SessionListener差不多,也是实现一个监听器监听session,由于在SessionListener无法得到用户ID(userId),我在用户登录是用了session.setAttribute
方法,把用户ID添加到session中,覆盖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对象就可以了