以前没做过这种功能,现在遇到了,有些地方不明白,所以问下大家,该需求我相信大家都比较熟悉吧,所以需求我不作过多解释,我想讨论的是如果解决:用户断网,用户直接关闭浏览器(当然可以使用浏览器关闭事件),用户结束任务管理器,用户直接关闭电脑等。在这种情况大家是怎么处理的?
    平台(登录后才能访问页面,没登录前访问项目处于登录页面,就是登录后才算真正在线)在线统计的时候同一个账号可以多处登录,我的思路是:登录后,把用户的id和登录时间作为key,最后访问时间作为value放入一个map对像(对象名暂时定为UserMapSession)。另外在用户访问的页面定时向服务器请求一次表示在线(定时时间为一分钟, 这样就可以解决用户非正常退出造成统计数量不准的问题),服务端对定时访问的信自进行相关处理(主要是更新最后访问时间)。然后开一个线程来定时迭代这个map,把最后访问时间大于10分钟(时间自己定)的用户对像作为退出对像进行清理。这种思路可行不,大家发表意见,谢谢

解决方案 »

  1.   

    http://blog.sina.com.cn/s/blog_40e2140e01000a9y.html
    不知能不能帮到你,另外有好的方法希望可以分享下
      

  2.   

    兄弟,你这个没办法处理用户直接关闭电脑,从任务管理器里结束,alt+f4这些情况无法处理嘛。
      

  3.   

    用户正常登录,退出登录,要更新在线人数;
    用户关闭浏览器,会触发一个事件,可以通过Ajax告知服务器,及时要更新在线人数;
    开一个session监听器,当客户端出现意外情况,比如断电了,断网了,电脑重启了,结束浏览器进程了等等,session都会被销毁,你就赶紧更新在线人数;
    在服务器启动时,开一个线程,专门用来清理已经登录超时的用户;
    以上4点都能做到的话,统计在线人数的准确率可达98%
      

  4.   


    public class UserHttpSessionEventPublisher implements HttpSessionListener
    {
        
        private static final String LOGGER_NAME = UserHttpSessionEventPublisher.class.getName();
        
        //~ Methods ========================================================================================================
       /* ApplicationContext getContext(ServletContext servletContext)
        {
            return WebApplicationContextUtils.getWebApplicationContext(servletContext);
        }*/
        
        /**
         * Handles the HttpSessionEvent by publishing a {@link HttpSessionCreatedEvent} to the application
         * appContext.
         *
         * @param event HttpSessionEvent passed in by the container
         */
        public void sessionCreated(HttpSessionEvent event) {
            在这里累加,(可通过保存在session里的登录用户信息,判断是不是同一人,)    }    
        @Override
        public void sessionDestroyed(HttpSessionEvent event){
          在这里-1;
         }
        web.xml 加      <listener>
    <listener-class>
    com.huawei.datavoice.security.UserHttpSessionEventPublisher
        </listener-class>
    </listener>
      

  5.   

    你说的监听器是  创建一个实现HttpSessionListener的类啥。比如断电了,断网了,电脑重启了,结束浏览器进程了等等这些信息是监控不了的。
      

  6.   

    可以在web.xml里设置session的有效期,在session失效时会调用sessionDestroy方法,这时人数就会-1,WEB里统计人数只能这么做,不可能做到客户端那种统计人数
      

  7.   


    谢谢,session.invalidate()方法也会调用sessionDestroy 方法。我现在纳闷的是,用户非正常退出的时候我没办法监控。
      

  8.   

    web系统,根本就做不了精确统计。
    你说的session监听,是监听不到异常关闭,但当对应的session失效的时候,还是能监听到的,