zoukankan      html  css  js  c++  java
  • 统计在线人数

    在线用户使用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. }  
  • 相关阅读:
    两周深度学习计划(二)
    两周深度学习计划(一)
    [Spark性能调优] 第二章:彻底解密Spark的HashShuffle
    [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析
    [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
    [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
    [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
    [Spark内核] 第30课:Master的注册机制和状态管理解密
    [Spark内核] 第29课:Master HA彻底解密
    [Spark内核] 第28课:Spark天堂之门解密
  • 原文地址:https://www.cnblogs.com/kongxc/p/7966078.html
Copyright © 2011-2022 走看看