使用HttpSessionListener监听器 监控当前网站在线人数

ServletAPI提供了大量的监听器来监听WEB应用的内部事件,以下简单利用HttpSessionListener监听器来实现监控当前网站的在线人数。

相应代码如下:

  1. package neo.app.servlet;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.ServletContext;  
  7. import javax.servlet.http.HttpSession;  
  8. import javax.servlet.http.HttpSessionEvent;  
  9. import javax.servlet.http.HttpSessionListener;  
  10.   
  11. import neo.app.service.ServiceManager;  
  12. import neo.core.Constants;  
  13. import neo.core.bean.BeanManager;  
  14.   
  15. import org.apache.commons.logging.Log;  
  16. import org.apache.commons.logging.LogFactory;  
  17.   
  18. /** 
  19.  * 用于记录在线人数,用户退出日志写入 
  20.  * 
  21.  */  
  22. public class SessionListener implements HttpSessionListener {  
  23.     private final Log log = LogFactory.getLog(getClass());  
  24.     private final String COUNT_KEY = "sessions";  
  25.   
  26.     /** 
  27.      * session创建时执行的方法,用户登录时执行 
  28.      */  
  29.     public void sessionCreated(HttpSessionEvent event) {  
  30.         HttpSession session = event.getSession();  
  31.         ServletContext application = session.getServletContext();  
  32.   
  33.         // 在application范围由一个HashSet集保存所有的session   
  34.         HashSet sessions = (HashSet) application.getAttribute(COUNT_KEY);  
  35.         if (sessions == null) {  
  36.             sessions = new HashSet();  
  37.             application.setAttribute(COUNT_KEY, sessions);  
  38.         }  
  39.   
  40.         // 新创建的session均添加到HashSet集中   
  41.         sessions.add(session);  
  42.   
  43.         // 然后使用sessions.size()获取当前活动的session数,即为“在线人数”   
  44.         log.debug("sessionCreated 网站在线人数(含未登录的访问) 为:" + sessions.size());  
  45.   
  46.         //由于此处无法获得登录用户的IP信息  
  47.         //用户登录日志转向到用户登录action中完成  
  48.     }  
  49.   
  50.     /*** 
  51.      * session销毁时执行的方法,用户主动退出/浏览器关闭Session过期 时执行 
  52.      */  
  53.     public void sessionDestroyed(HttpSessionEvent event) {  
  54.         HttpSession session = event.getSession();  
  55.         ServletContext application = session.getServletContext();  
  56.         HashSet sessions = (HashSet) application.getAttribute(COUNT_KEY);  
  57.   
  58.         if (null != sessions && sessions.contains(session)) {  
  59.             Object userObj = session.getAttribute(Constants.LOGIN_USER);  
  60.             log.debug("userObj is:" + userObj);  
  61.             if (userObj != null) {//判断是否为登录后包含用户信息的数据(已经登录)  
  62.                 Map userMap = (Map) userObj;  
  63.                 String username = (String) userMap.get("username");  
  64.                 log.debug("用户" + username + "退出");  
  65.                 Long loginid = (Long) userMap.get(Constants.LOGIN_LOGID);  
  66.                 //调用memberService来进行用户退出日志写入  
  67.                 ((ServiceManager) BeanManager.getBean("serviceManager")).getMemberService().insertLogoutLog(loginid,  
  68.                         username);  
  69.             } else {//未进行登录  
  70.                 log.debug("session存在,但是尚未进行用户登录");  
  71.             }  
  72.         } else {  
  73.             //session已经不存在此退出对象了  
  74.             log.debug("session已经不存在此退出对象了");  
  75.         }  
  76.   
  77.         // 销毁的session均从HashSet集中移除   
  78.         if (sessions != null) {  
  79.             sessions.remove(session);  
  80.             //更新在线人数数据  
  81.             log.debug("sessionDestroyed 网站在线人数(含未登录的访问) 为:" + sessions.size());  
  82.         }  
  83.     }  
  84.   
  85. }  

当然最后别忘了在web.xml文件中对监听器进行配置,配置也很简单,如下

  1. <listener>   
  2.        <listener-class>neo.app.servlet.SessionListener</listener-class>   
  3.    </listener>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值