统计在线人数

在线用户使用HttpSessionListener监听器统计  

每当一个session会话建立  在线用户人数+1

每当一个session会话销毁 在线用户人数-1

使用ServletRequestListener监听器统计用户信息

每当一个request建立  将当前用户放入集合

每当session会话销毁  将当前用户移出集合

我使用的是Servlet3.0  监听器直接使用注解@webListener即可 不用在web.xml中布局

在web.xml中配置session-timeout标签  标志session过期时间为1分钟  0为不过期

  1. <session-config>  
  2.     <session-timeout>1</session-timeout>  
  3. </session-config>  

由于session对话关闭时间并不一定以设置的1分钟为准 所以 gif图像中最后等待时间较长

User 实体类

  1. package com.scx.entity;  
  2.   
  3.   
  4. /** 
  5.  * 用户实体类 
  6.  * 
  7.  */  
  8. public class User {  
  9.     //当前用户的session id  
  10.     private String sessionId;  
  11.     //当前用户的ip地址  
  12.     private String ip;  
  13.     //当前用户第一次访问的时间  
  14.     private String firstTime;  
  15.     public User() {  
  16.         super();  
  17.           
  18.     }  
  19.     public String getIp() {  
  20.         return ip;  
  21.     }  
  22.     public void setIp(String ip) {  
  23.         this.ip = ip;  
  24.     }  
  25.     public String getFirstTime() {  
  26.         return firstTime;  
  27.     }  
  28.     public void setFirstTime(String firstTime) {  
  29.         this.firstTime = firstTime;  
  30.     }  
  31.     public String getSessionId() {  
  32.         return sessionId;  
  33.     }  
  34.     public void setSessionId(String sessionId) {  
  35.         this.sessionId = sessionId;  
  36.     }  
  37.       
  38. }  

HttpSessionListener监听器

  1. package com.scx.listener;  
  2.   
  3. import java.util.ArrayList;  
  4. import javax.servlet.annotation.WebListener;  
  5. import javax.servlet.http.HttpSessionEvent;  
  6. import javax.servlet.http.HttpSessionListener;  
  7.   
  8. import com.scx.entity.User;  
  9. import com.scx.util.SessionUtil;  
  10. /** 
  11.  * HttpSessionListener 监听器 
  12.  * 
  13.  */  
  14. @WebListener  
  15. public class MyHttpSessionListener implements HttpSessionListener{  
  16.     //当前用户数  
  17.     private int userCounts=0;  
  18.     @Override  
  19.     public void sessionCreated(HttpSessionEvent se) {  
  20.         //sessionCreated  用户数+1  
  21.         userCounts++;  
  22.         //重新在servletContext中保存userCounts  
  23.         se.getSession().getServletContext().setAttribute("userCounts", userCounts);  
  24.           
  25.     }  
  26.     @Override  
  27.     public void sessionDestroyed(HttpSessionEvent se) {  
  28.         //sessionDestroyed  用户数-1  
  29.         userCounts--;  
  30.         //重新在servletContext中保存userCounts  
  31.         se.getSession().getServletContext().setAttribute("userCounts", userCounts);  
  32.           
  33.         @SuppressWarnings("unchecked")  
  34.         ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");  
  35.         String sessionId=se.getSession().getId();  
  36.         //如果当前用户在userList中  在session销毁时  将当前用户移出userList  
  37.         if(SessionUtil.getUserBySessionId(userList, sessionId)!=null){  
  38.             userList.remove(SessionUtil.getUserBySessionId(userList, sessionId));  
  39.         }  
  40.         //将userList集合  重新保存到servletContext  
  41.         se.getSession().getServletContext().setAttribute("userList", userList);  
  42.     }  
  43.   
  44. }  

ServletRequestListener监听器

  1. package com.scx.listener;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.ArrayList;  
  5. import java.util.Date;  
  6. import javax.servlet.ServletRequestEvent;  
  7. import javax.servlet.ServletRequestListener;  
  8. import javax.servlet.annotation.WebListener;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import com.scx.entity.User;  
  11. import com.scx.util.SessionUtil;  
  12.   
  13. /** 
  14.  * ServletRequestListener 监听器 
  15.  * 
  16.  */  
  17. @WebListener  
  18. public class MyServletRequestListener implements ServletRequestListener {  
  19.     //用户集合  
  20.     private ArrayList<User> userList;  
  21.     @Override  
  22.     public void requestDestroyed(ServletRequestEvent arg0) {  
  23.               
  24.     }  
  25.   
  26.     @SuppressWarnings("unchecked")  
  27.     @Override  
  28.     public void requestInitialized(ServletRequestEvent arg0) {  
  29.         //从servletContext中获的userList  
  30.         userList=(ArrayList<User>) arg0.getServletContext().getAttribute("userList");  
  31.         //如果servletContext中没有userList对象  初始化userList  
  32.         if(userList==null){  
  33.             userList=new ArrayList<User>();  
  34.         }  
  35.         HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();  
  36.           
  37.         //sessionId  
  38.         String sessionId=request.getSession().getId();  
  39.         //如果当前sessionId不存在集合中  创建当前user对象  
  40.         if(SessionUtil.getUserBySessionId(userList,sessionId)==null){  
  41.             User user=new User();  
  42.             user.setSessionId(sessionId);  
  43.             user.setIp(request.getRemoteAddr());  
  44.             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");  
  45.             user.setFirstTime(sdf.format(new Date()));  
  46.             userList.add(user);  
  47.         }  
  48.         //将userList集合 保存到ServletContext  
  49.         arg0.getServletContext().setAttribute("userList", userList);  
  50.     }  
  51. }  

工具类

  1. package com.scx.util;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.scx.entity.User;  
  6.   
  7. public class SessionUtil {  
  8.     //根据sessionId判断当前用户是否存在在集合中  如果存在 返回当前用户  否则返回null  
  9.     public static User getUserBySessionId(ArrayList<User> userList,String sessionId) {  
  10.         for (User user : userList) {  
  11.             if(sessionId.equals(user.getSessionId())){  
  12.                 return user;  
  13.             }  
  14.         }  
  15.         return null;  
  16.     }  
  17. }  
原文地址:https://www.cnblogs.com/kongxc/p/7966078.html