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对象就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值