呵呵!你想得已经比较全面了。结论,在线人数只能是近似的数量,不会是精确的。 所以就别浪费感情了!OVER

解决方案 »

  1.   

    把Session过期设为3分钟,客户端每隔2分钟用Ajax向服务端发送一个访问Session的请求,系统关闭时清除Session,如遇非正确退出,则Session过期后会自动清除。 过期时间和发送请求的时间可根据具体情况或精度要求进行调整。
      

  2.   

    把session过期设为多长时间,应该具体问题具体分析,不是死时间哟
      

  3.   

      程序里面可以手动删除session吗?session中的attribute字段为空后不是依旧存在的吗??
      

  4.   

    情况太复杂,基本的就是设置session的最大空闲时间,也可以加关闭浏览器像服务器发送信息的,但是好多因素,有人是点X关闭,有人习惯alt+f4,有人点了文件菜单在按退出,有嫌麻烦直接关机拔电源的。总之有个基础应对方法,其他的仁者见仁智者见智。
      

  5.   

    我给一个比较有趣的做法,当然很耗费资源。那就是持续连接。你做一个包含页面,用ajax/iframe里面调用。让每个可访问的页面都调用这个。这个页面的代码大致如下。while(true){
      try{
        out.println(); // 输出一个空行
         out.flush(); // 这一句必须写
        // 检查当前在线人员,确保它没有被删掉
        check(session);
        try{
          Thread.sleep(10); // 休眠一下吧
        }catch(Exception ex){}
      }catch(Exception ex){
        // 一旦发现异常,则证明此用户已经离开当前页面
        // 从在线人员里面删掉当前人员
         remove(session);
      }
    }我们在check里面要判断用户是否已经有1个持久连接在工作,以免用户同时打开多个页面造成多个持久连接这个方法可以在用户和服务器之间保持一个持久的连接,一旦异常,则该用户就离开了这个页面。此方法可以最大限度的精确在线人员数,但是也非常耗费系统资源。 思路借鉴于网游。
    他们就是持续的连接。
      

  6.   

    最新的思路,请看这里 
    http://www.java2000.net/viewthread.jsp?tid=647
    或者我在CSDN的博客 http://blog.csdn.net/java2000_net/archive/2008/02/10/2087529.aspx