最近用户急要一个在线统计用户列表的模块,在网上搜了些例子,大部分都是用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对象就可以了
分享到:
相关推荐
这个资源是针对session容器的,在具有多个session的session容器里需要进行注册,所以就有了这个代码。不过写的还是很粗糙的。
使用SessionListener+持久化Session+Springmvc拦截器实现单点登录
jsp中唯一登录,使用session控制.
监控器需要的jar,需在web.xml中配置 <filter-name>monitoring ... <listener-class>net.bull.javamelody.SessionListener</listener-class> 通过web地址:http:xxxx/项目名/monitoring 可以进入到监控页面
javax.media.rtp.event ...通知SessionListener的数据包/ RTCP协议的数据包已经开始停止后抵达抵达。如果在一个活跃的发件人,这涉及到国家的数据包的ReceiveStream 。在被动的情况下接收器,在ReceiveStream将是无效
<listener-class>net.bull.javamelody.SessionListener</listener-class> 2、需监控的web工程引入依赖jar包 jira-javamelody.jar jrobin-1.5.9.1.jar 3、如果您的web项目有SpringSecurity,修改Spring...
- SessionListener: contextInitialized() - Starting Coyote HTTP/1.1 on http-8080 - JK: ajp13 listening on /0.0.0.0:8009 - Jk running ID=0 time=0/32 config=null - Find registry server-registry.xml at ...
{"time":"2017-09-06 10:24:48,649","logtype":"INFO","loginfo":"org.apache.catalina.core.ContainerBase.[Catalina].[bms-res.hzfh.com].[/examples]:SessionListener: contextInitialized()"} {"time":"2017-09-...