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

来源:互联网 发布:知乎 桃花灼灼宜室宜家 编辑:程序博客网 时间:2024/06/07 00:55

     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失效的iphm.remove((String) context.getAttribute(session.getId()));System.out.println("sessionDestroy:"+"在线人数:"+hm.size()+"---"+(String) context.getAttribute(session.getId())+"的session连接数:0:"+session.getId());//context中移除放入其中的ip地址和 sessionidcontext.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中移除放入其中的 sessionidcontext.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连接

0 0
原创粉丝点击