项目需要记录当前登录的在线人数,现已没有问题;而且也写了一个方法实现HttpSessionBindingListener接口,
在IE6中,当关闭IE浏览器可以使当前在线人数减一,但在IE7中,关闭浏览器,当前在线人数不变,不知是何原因,
小弟百思不得其解,恳请各位大侠能指点迷津,有何解决办法!

解决方案 »

  1.   

    这样的话,估计就要研究IE7相比之IE6的特性了。莫非IE7关闭后,出于某种原因,它没有断开连接?
      

  2.   

    可以自己截一下包看看。。我知道只要是火狐每次关闭的时候他都会给他打开的每一个socket连接发fin包过去的。可是我没有看过IE的会怎么样,也有可能他虽然IE关闭了。可是对应的进程还存在。这样父进程没有关闭。socket连接应该还是没有断开的。
      

  3.   

    要调用session.invadate..()方法才可以取消绑定
      

  4.   

    这是我写的一个统计在线人数的主要代码:请楼主看看,看对你有没有帮助
    public class PersonListener implements ServletContextListener,HttpSessionListener{ public void contextDestroyed(ServletContextEvent event) {
    // TODO Auto-generated method stub
    Properties ps=new Properties();
    ServletContext app=event.getServletContext();
    String path=app.getRealPath("/WEB-INF/countPerson.ini");
    Integer count=(Integer)app.getAttribute("count");
    System.out.println("end="+count);
    ps.setProperty("count",count.toString());
    PrintWriter pw=null;
    try {
    pw=new PrintWriter(path);
    ps.list(pw);
    pw.close();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("请求上下文结束");
    } public void contextInitialized(ServletContextEvent event) {
    // TODO Auto-generated method stub
    Properties ps=null;
    ServletContext app=event.getServletContext();
    String path=app.getRealPath("/WEB-INF/countPerson.ini");
    try {
    InputStream in=new FileInputStream(path);
    ps=new Properties();
    ps.load(in);
    in.close();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    Integer count=Integer.parseInt(ps.getProperty("count"));
    app.setAttribute("count",count );
    app.setAttribute("curr",0);
    System.out.println("请求上下文开始"+ps.getProperty("count"));
    }

    public void sessionCreated(HttpSessionEvent session) {
    // TODO Auto-generated method stub
    ServletContext app=session.getSession().getServletContext();
    synchronized (app) {
    Integer count=(Integer)app.getAttribute("count");
    count++;
    app.setAttribute("count",count);
    System.out.println("sessionCount="+count);

    Integer curr=(Integer)app.getAttribute("curr");
    curr++;
    app.setAttribute("curr",curr);
    System.out.println("sessionCurr="+curr);
    }
    } public void sessionDestroyed(HttpSessionEvent session) {
    // TODO Auto-generated method stub
    ServletContext app=session.getSession().getServletContext();
    synchronized (app) {
    Integer curr=(Integer)app.getAttribute("curr");
    curr--;
    app.setAttribute("curr",curr);
    }
    }
    }
      

  5.   

        这个统计人数应该有个“访问页面”的总人数,这个人数应放在application作用域中,并在关闭服务器时应将总人数保存到一个文件中,当服务器关闭时会调用contextDestroyed()这个方法,这样就可以保存最终数据。
        还应有个“访问页面”的在线人数,这个当前人数就应放在session作用域中,当打开一个页面时就有一个唯一的session标识就会调用sessionCreated()方法这样就可以将当前人数加1;当页面关闭时将调用sessionDestroyed()方法这样就可以将当前人数减1.
        我的意思大概是这样,具体情况请看代码。
      

  6.   


    public class OnlineCounter {  
      private static long online = 0;    
      public static long getOnline(){ 
          return online; 
        } 
        public static void raise(){ 
          online++; 
        } 
        public static void reduce(){ 
          online--; 
      } 
    } import javax.servlet.http.HttpSessionEvent; 
    import javax.servlet.http.HttpSessionListener; 
    public class OnlineCounterListener implements HttpSessionListener{ 
        public void sessionCreated(HttpSessionEvent hse) { 
            OnlineCounter.raise();  
        } 
      public void sessionDestroyed(HttpSessionEvent hse){  
            OnlineCounter.reduce(); 
        } 
    } 这样可以么?
      

  7.   

    Up java 超级群 :有时间大家共同交流 51177847
      

  8.   

    看楼主的应用场景了,我一般都用HttpSessionListener做在线用户数的统计,
    当然,部署在Tomcat上面,重启服务的时候,数据有可能会不准确。
    使用HttpSessionBindingListener时,我记得是要向每个session对象里面setAttribute来设置。
    一般情况下,只要你不动这个Attribute,它是能够监听到session的销毁事件的。楼主没有监听到销毁事件,最大的可能性是IE7关闭的时候,没有通知服务端销毁session,
    这样,应该在session超时的时候,会被销毁。楼主可以尝试把session超时设短一点,比如一分钟。
    在IE7上面试一下session超时,session超时后服务端应该能够监听到valueUnbound。
      

  9.   

    关闭浏览器,服务器的session不一定销毁的,除非是显式的提交,例如点击退出按钮,如果点击 叉号 退出则看他服务器设置的session失效的时间了