博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
统计在线人数
阅读量:5236 次
发布时间:2019-06-14

本文共 3835 字,大约阅读时间需要 12 分钟。

对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。

    1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。

 public class SessionListener implements HttpSessionAttributeListener

{
 public void attributeAdded(HttpSessionBindingEvent event)
 {
  if (event.getName().equals("userid"))
  {
   try
   {
      OnlineCounter.doUser(event.getValue(),false);
   } catch (Exception e)
   {
    e.printStackTrace();
   }
  }

 }

 public void attributeRemoved(HttpSessionBindingEvent event)

 {
  
  if (event.getName().equals("userid"))
  {
   try
   {
      OnlineCounter.doUser(event.getValue(),true);
   } catch (Exception e)
   {
    e.printStackTrace();
   }

  }

 }

 

 
 public void attributeReplaced(HttpSessionBindingEvent event)
 {
 }

}

2、要做的就是实现任务类OnlineCounter了

public class OnlineCounter

{
 private static List list = new ArrayList();
 private static List list1 = new ArrayList();

   private OnlineCounter() {

   }

   // 统计当前在线会员人数

   public static void doUser(Object object,boolean bl) {
     //得到用户当前访问时间
     String nowtime = getTime("mm:ss");
     //Str数组用来存放用户的id和访问时间
     String[] str = new String[2];
     str[0] = object.toString();
     str[1] = nowtime;

     //temp数组用来临时存放从list里面取出的用户的id和访问时间

     String[] temp = new String[2];

     //循环list

       for (int i = 0; i < list.size(); i++) {
       temp = (String[])list.get(i);
       //如果从list里面取出的用户ip和str里面存放的id相同,则更新访问时间
       if(bl==false && temp[0].equals(str[0])) {
         list.set(i,str);
         return;
       }
       //如果监听类中穿过来bl==true,则认为不在线
       if(bl==true && temp[0].equals(str[0]))
       {
         list.remove(i);
       }
     }
     //添加一个新的在线用户
     if(bl==false)  
     list.add(str);
     //释放资源
     str = null;temp = null;
   }

   //统计网站所有在线人数

   public static void allUser(Object object) {
      //得到用户当前访问时间
      String nowtime = getTime("mm:ss");
      //Str数组用来存放用户得ip和访问时间
      String[] str = new String[2];
      str[0] = object.toString();
      str[1] = nowtime;

      //temp数组用来临时存放从list里面取出的用户ip和访问时间

      String[] temp = new String[2];

      //循环list

        for (int i = 0; i < list1.size(); i++) {
        temp = (String[])list1.get(i);
        //如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间
        if( temp[0].equals(str[0])) {
          list1.set(i,str);
          return;
        }
        //如果用户超过10分钟没有访问,则认为不在线
        if(subTime(nowtime,temp[1]) > 600)
        {
       //System.out.print("清空list过期的值"+i);
          list1.remove(i);
        }

      }

      //添加一个新的在线用户  
      list1.add(str);
      //释放资源
      str = null;temp = null;
    }
   public static int getOnlineAllCount() {
      //返回当前在线人数
      return list1.size();
    }
   public static int getOnlineCount() {
     //返回当前在线人数
     return list.size();
   }
  
   /*public static void romovelist()
   {
   
   }*/

   public static List getOnline() {

     return list;
   }
   /** 计算两个时间差,返回相差秒数 */
   public static int subTime(String src,String des) {
     int n = 0;
     .util.Calendar ca = .util.Calendar.getInstance();
     long time1 =compareStringTime(src,des,"mm:ss");
     ca.setTimeInMillis(time1);
     n = (ca.get(java.util.Calendar.MINUTE)) * 60;
     n = n + ca.get(java.util.Calendar.SECOND);
     return n;
   }
  
   /**
    * 获得当前时间
    * @param parrten 输出的时间格式
    * @return 返回时间
    */
   public static String getTime(String parrten)
   {
     String timestr;
     if(parrten==null||parrten.equals(""))
     {
       parrten="yyyyMMddHHmmss";
     }
     java.text.SimpleDateFormat sdf=new SimpleDateFormat(parrten);
     java.util.Date cday=new Date();
     timestr=sdf.format(cday);
     return timestr;
   }

   /**

    * 比较两个字符串时间的大小
    * @param t1 时间1
    * @param t2 时间2
    * @param parrten 时间格式 :yyyy-MM-dd
    * @return 返回long =0相等,>0 t1>t2,<0 t1<t2
    */
   public static long compareStringTime(String t1,String t2,String parrten)
   {
       SimpleDateFormat formatter = new SimpleDateFormat (parrten);
       ParsePosition pos = new ParsePosition(0);
       ParsePosition pos1 = new ParsePosition(0);
       Date dt1=formatter.parse(t1,pos);
       Date dt2=formatter.parse(t2,pos1);
       long l=dt1.getTime()-dt2.getTime();
       return l;
   }
  
}

3、在web。xml中配置监听类

<!--  online user  -->

 <listener>
        <listener-class>baby.com.common.SessionListener</listener-class> 
 </listener>

最后就是在访问页面调用类中的alluser方法来实现统计在线人数就可以了

String ip="";

 if (request.getHeader("x-forwarded-for") == null)
 {
    ip= request.getRemoteAddr();
  }
  else
  {
    ip=request.getHeader("x-forwarded-for");
  }
       OnlineCounter.allUser(ip);

这样就完成了 在线统计功能。  如有什么更好的方法请留言谢谢! 

转载于:https://www.cnblogs.com/weipeng/p/3370536.html

你可能感兴趣的文章
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>
linux常用命令
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>