javaweb监听器记录应用的在线人数[从学习到工作(四)]

     1.web.xml的配置

        

 <listener>
    <listener-class>com.test.listener.MySessionListener</listener-class>
</listener>
<session-config>  
    <session-timeout>1</session-timeout>  
</session-config> 
      2.java代码

     

package com.test.listener;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 记录访问应用的在线人数
 * @author zenglx
 *
 */
public class MySessionListener implements HttpSessionListener,ServletRequestListener{

	 private static String ip = null;
	 private static Map<String,Integer> hm = new HashMap<String,Integer>();
	 private static int activeNumber = 1;
	
	public void sessionCreated(HttpSessionEvent event) {
		HttpSession session = event.getSession();
		ServletContext context = session.getServletContext();
		activeNumber = (Integer) (context.getAttribute(ip)==null?1:context.getAttribute(ip));
		if(hm.isEmpty()) {
			hm.put(ip, activeNumber);
		} else {
		     Set<String> keys = hm.keySet();
		     //判断ip是否在map中
		     boolean isContans = keys.contains(ip);
		     if(isContans) {
		    	 activeNumber++;
		    	 //将ip和session连接数放入map中,在key相同的情况下,Map中只有一个键值对
		    	 hm.put(ip, activeNumber);
		     } else {
		    	 hm.put(ip, activeNumber);
		     }
		}
		context.setAttribute(ip, activeNumber);
		context.setAttribute(session.getId(),ip);
		System.out.println("sessionCreated:"+"在线人数:"+hm.size()+"---"+ip+"的session连接数:"+activeNumber+":"+session.getId());
		
		//将在线人数放入context中
		context.setAttribute("onLineNumber", hm.size());
	}

	public void sessionDestroyed(HttpSessionEvent event) {
		HttpSession session = event.getSession();
		ServletContext context = session.getServletContext();
		int active = (Integer) context.getAttribute((String) context.getAttribute(session.getId()));
		if(active == 1) {
			context.setAttribute((String) context.getAttribute(session.getId()), active);
			//map中移除session失效的ip
			hm.remove((String) context.getAttribute(session.getId()));
			System.out.println("sessionDestroy:"+"在线人数:"+hm.size()+"---"+(String) context.getAttribute(session.getId())+"的session连接数:0:"+session.getId());
			//context中移除放入其中的ip地址和 sessionid
			context.removeAttribute((String) context.getAttribute(session.getId()));
			context.removeAttribute(session.getId());
		} else {
			context.setAttribute((String) context.getAttribute(session.getId()), active-1);
			System.out.println("sessionDestroy:"+"在线人数:"+hm.size()+"---"+(String) context.getAttribute(session.getId())+"的session连接数:"+(active-1)+":"+session.getId());
			//context中移除放入其中的 sessionid
			context.removeAttribute(session.getId());
		}
		//将在线人数放入context中
		context.setAttribute("onLineNumber", hm.size());
	}

	public void requestDestroyed(ServletRequestEvent arg0) {
		
	}

	public void requestInitialized(ServletRequestEvent event) {
		ServletRequest request = event.getServletRequest();
		HttpServletRequest req = (HttpServletRequest) request;
		ip = req.getRemoteAddr();
	}

}

总结:记录在某一时间应用访问的在线人数,可以看到同一IP下有多少session连接

猜你喜欢

转载自blog.csdn.net/zengliangxi/article/details/34534329