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连接