SessionListener与SessionAttributeListener统计用户在线问题

   最近用户急要一个在线统计用户列表的模块,在网上搜了些例子,大部分都是用SessionListener统计在线人数的,无法得到具体访问的用户列表。尝试了一下用
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对象就可以了

你可能感兴趣的:(xml,Web,servlet)