session 有效时间设为4个小时,实现HttpSessionListener对session进行相关处理,如何相对准确的统计当前在线人数。
现在问题是session设为4个小时,用户10几个小时后都没有失效

解决方案 »

  1.   

    import java.util.HashSet;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
     
    public class MySessionListener implements HttpSessionListener {
     
           public void sessionCreated(HttpSessionEvent event) {
                  HttpSession session = event.getSession();
                  ServletContext application = session.getServletContext();
                  
                  // 在application范围由一个HashSet集保存所有的session
                  HashSet sessions = (HashSet) application.getAttribute("sessions");
                  if (sessions == null) {
                         sessions = new HashSet();
                         application.setAttribute("sessions", sessions);
                  }
                  // 新创建的session均添加到HashSet集中
                  sessions.add(session);
                  // 可以在别处从application范围中取出sessions集合
                  // 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
           }
     
           public void sessionDestroyed(HttpSessionEvent event) {
                  HttpSession session = event.getSession();
                  ServletContext application = session.getServletContext();
                  HashSet sessions = (HashSet) application.getAttribute("sessions");
                  
                  // 销毁的session均从HashSet集中移除
                  sessions.remove(session);
           }
    }
      

  2.   

    问题就是session有效期长了之后sessionDestroyed方法时间,从昨天设session有效期为4个小时的测试来看它10多个小时都没调用
      

  3.   

    package com.totyustar.action.cartoonoriginality.servlet;import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;public class OnlinePersonSessionListener implements HttpSessionListener 
    {
        private static long online = 0; 
        public void sessionCreated(HttpSessionEvent hse) { 
         online = online +1;
        } 
        public void sessionDestroyed(HttpSessionEvent hse) { 
         online = online - 1;
         }
         //获取当前session有效数
    public static long getOnline() {
    if(online<0)
    return 0;
    return online;
    }
    }
      

  4.   

    这个方法我会用,现在问题是sessionDestroyed,在session有效期为4小时的情况下,监听触发的时间不对