您的位置:首页 > 编程语言 > Java开发

java 实现统计在线人数

2013-03-16 11:55 549 查看
对于登录信息时使用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;

java.util.Calendar ca = java.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);

这样就完成了 在线统计功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: