解决方案 »

  1.   

    第一个问题好解决,在struts拦截器中设缓存例如20分钟,如果缓存中没有数据,说明是第一次登录,插入数据表,如果有数据说明用户已经记录过了。用户每次访问任何页面或者刷新页面都重置缓存时间。
      

  2.   

    心跳是为了判断当前连接是否有效,可被使用。如果可以及时的判断出当前连接已经失效了,就可以准确断定该用户已经下线。这种办法相对来讲还是比较靠谱点的。但是也有一定性能代价,client 比较小,服务器端会较大。
      

  3.   

    session的话 ,浏览器打开会有一个令牌,除非关闭浏览 否则始终是这个令牌,可以用这个判断,当然切换用户令牌是会改变的
      

  4.   

    我们最后还是用的这个设计。最后只取中心,区部,团队都不为空的情况。贴一下sql.SELECT *
      FROM (SELECT E.CENTERNAME,
                   E.AREANAME,
                   E.TEAMNAME,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 8 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           8 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS EIGHT,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 9 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           9 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS NINE,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 10 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           10 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS TEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 11 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           11 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS ELEVEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 12 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           12 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS TWELVE,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 13 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           13 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS THIRTEEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 14 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           14 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS FOURTEEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 15 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           15 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS FIFTEEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 16 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           16 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS SIXTEEN,
                    (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 17 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           17 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS SEVENTEEN,
                    (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 18 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           18 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS EIGHTEEN,
                   (SELECT COUNT(1)
                      FROM EKBS_ONLINE O
                     WHERE O.TEAMNAME = E.TEAMNAME
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND '0' <> NVL(O.AREANAME, '0')
                       AND '0' <> NVL(O.TEAMNAME, '0')
                       AND LOGINDATE = TRUNC(SYSDATE)
                       AND 19 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                       AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                           19 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS NINETEEN,
                   ('-') AS TWENTY
              FROM EKBS_ONLINE E
             WHERE LOGINDATE = TRUNC(SYSDATE)
               AND '0' <> NVL(E.TEAMNAME, '0')
               AND '0' <> NVL(E.AREANAME, '0')
               AND '0' <> NVL(E.CENTERNAME, '0')
             GROUP BY E.TEAMNAME, E.AREANAME, E.CENTERNAME
             ORDER BY E.TEAMNAME)
     WHERE ROWNUM <= 100
      

  5.   

    这个只能获取到IE的。其他浏览器获取不到 //关闭浏览器时才会触发此操作,刷新页面不执行
     //n 检测鼠标相对于用户屏幕的水平位置 - 网页正文部分左:求出鼠标在当前窗口上的水平位置(参照:当前窗口右上角为0、0坐标) 
     //m 网页正文全文宽 20这个值是指关闭按钮的宽度
     //b=false,鼠标在当前窗口内   水平坐标
     //b= true;鼠标在当前窗口外     水平坐标
     //y 垂直坐标 y>0鼠标在当前窗口内  ;y<0 鼠标在当前窗口外
     //window.event.altKey  当alt键按下时,值为 TRUE ,否则为 FALSE 。只读。 
     function onunload_handler(){ 
    // IE6 浏览器执行 判断当前浏览器版本 begin
     if (window.ActiveXObject) {
        var ua = navigator.userAgent.toLowerCase();
        var ie=ua.match(/msie ([\d.]+)/)[1]
        if(ie==6.0){
            if(window.event.clientX <= 0 || window.event.clientY <=0){
             $.ajax({
       type: "POST",
       url: "${ctx}/monitor/closeBrowser.do",
       async:false,
       success: function(){
      
       }
    });
        }else {            
                //刷新
            }
        }
    }
    // IE6 浏览器执行 判断当前浏览器版本 end
      var n = window.event.screenX - window.screenLeft;
      var m = document.documentElement.scrollWidth-20;
      var b = n > m;
      var y = window.event.clientY;
      //关闭而非刷新
      if (b && y < 0 || window.event.altKey)
        {
          $.ajax({
       type: "POST",
       url: "${ctx}/monitor/closeBrowser.do",
       async:false,
       success: function(){
      
       }
    });
        }

     }  
     //点击登出按钮
     function closeWindows(){
     $.ajax({
       type: "POST",
       url: "${ctx}/monitor/closeBrowser.do",
       async:false,
       success: function(){
      
       }
    });
     window.close();
     }