`

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对象就可以了

分享到:
评论

相关推荐

    sessionListener

    这个资源是针对session容器的,在具有多个session的session容器里需要进行注册,所以就有了这个代码。不过写的还是很粗糙的。

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    使用SessionListener+持久化Session+Springmvc拦截器实现单点登录

    SessionListener

    jsp中唯一登录,使用session控制.

    javamelody.jar和 jrobin.jar

    监控器需要的jar,需在web.xml中配置 &lt;filter-name&gt;monitoring ... &lt;listener-class&gt;net.bull.javamelody.SessionListener&lt;/listener-class&gt; 通过web地址:http:xxxx/项目名/monitoring 可以进入到监控页面

    JMF帮助文档(中文) doc

    javax.media.rtp.event ...通知SessionListener的数据包/ RTCP协议的数据包已经开始停止后抵达抵达。如果在一个活跃的发件人,这涉及到国家的数据包的ReceiveStream 。在被动的情况下接收器,在ReceiveStream将是无效

    javamelogdy-1.51.0

    &lt;listener-class&gt;net.bull.javamelody.SessionListener&lt;/listener-class&gt; 2、需监控的web工程引入依赖jar包 jira-javamelody.jar jrobin-1.5.9.1.jar 3、如果您的web项目有SpringSecurity,修改Spring...

    Struts2+Spring3+MyBatis3完整实例

    - 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 ...

    tomcat-juli.jar,tomcat-juli-adapters.jar,log4j-1.2.17.jar tomcat 8日志输出

    {"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-...

Global site tag (gtag.js) - Google Analytics