轉(zhuǎn)帖|其它|編輯:郝浩|2010-12-21 17:16:56.000|閱讀 594 次
概述:本文將介紹如何使用java統(tǒng)計(jì)在線人數(shù),希望對大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
對于登錄信息時(shí)使用session存儲的,所以我這里是通過實(shí)現(xiàn)HttpSessionAttributeListener這個(gè)接口完成的。
1、實(shí)現(xiàn)接口類,在web.xml文件中配置監(jiān)聽類,從而可以使該類完成其工作。
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、要做的就是實(shí)現(xiàn)任務(wù)類OnlineCounter了
public class OnlineCounter
{
private static List list = new ArrayList();
private static List list1 = new ArrayList();
private OnlineCounter() {
}
// 統(tǒng)計(jì)當(dāng)前在線會員人數(shù)
public static void doUser(Object object,boolean bl) {
//得到用戶當(dāng)前訪問時(shí)間
String nowtime = getTime("mm:ss");
//Str數(shù)組用來存放用戶的id和訪問時(shí)間
String[] str = new String[2];
str[0] = object.toString();
str[1] = nowtime;
//temp數(shù)組用來臨時(shí)存放從list里面取出的用戶的id和訪問時(shí)間
String[] temp = new String[2];
//循環(huán)list
for (int i = 0; i < list.size(); i++) {
temp = (String[])list.get(i);
//如果從list里面取出的用戶ip和str里面存放的id相同,則更新訪問時(shí)間
if(bl==false && temp[0].equals(str[0])) {
list.set(i,str);
return;
}
//如果監(jiān)聽類中穿過來bl==true,則認(rèn)為不在線
if(bl==true && temp[0].equals(str[0]))
{
list.remove(i);
}
}
//添加一個(gè)新的在線用戶
if(bl==false)
list.add(str);
//釋放資源
str = null;temp = null;
}
//統(tǒng)計(jì)網(wǎng)站所有在線人數(shù)
public static void allUser(Object object) {
//得到用戶當(dāng)前訪問時(shí)間
String nowtime = getTime("mm:ss");
//Str數(shù)組用來存放用戶得ip和訪問時(shí)間
String[] str = new String[2];
str[0] = object.toString();
str[1] = nowtime;
//temp數(shù)組用來臨時(shí)存放從list里面取出的用戶ip和訪問時(shí)間
String[] temp = new String[2];
//循環(huán)list
for (int i = 0; i < list1.size(); i++) {
temp = (String[])list1.get(i);
//如果從list里面取出的用戶ip和str里面存放的ip相同,則更新訪問時(shí)間
if( temp[0].equals(str[0])) {
list1.set(i,str);
return;
}
//如果用戶超過10分鐘沒有訪問,則認(rèn)為不在線
if(subTime(nowtime,temp[1]) > 600)
{
//System.out.print("清空list過期的值"+i);
list1.remove(i);
}
}
//添加一個(gè)新的在線用戶
list1.add(str);
//釋放資源
str = null;temp = null;
}
public static int getOnlineAllCount() {
//返回當(dāng)前在線人數(shù)
return list1.size();
}
public static int getOnlineCount() {
//返回當(dāng)前在線人數(shù)
return list.size();
}
/*public static void romovelist()
{
}*/
public static List getOnline() {
return list;
}
/** 計(jì)算兩個(gè)時(shí)間差,返回相差秒數(shù) */
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;
}
/**
* 獲得當(dāng)前時(shí)間
* @param parrten 輸出的時(shí)間格式
* @return 返回時(shí)間
*/
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;
}
/**
* 比較兩個(gè)字符串時(shí)間的大小
* @param t1 時(shí)間1
* @param t2 時(shí)間2
* @param parrten 時(shí)間格式 :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中配置監(jiān)聽類
<!-- online user -->
<listener>
<listener-class>baby.com.common.SessionListener</listener-class>
</listener>
最后就是在訪問頁面調(diào)用類中的alluser方法來實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)就可以了
String ip="";
if (request.getHeader("x-forwarded-for") == null)
{
ip= request.getRemoteAddr();
}
else
{
ip=request.getHeader("x-forwarded-for");
}
OnlineCounter.allUser(ip);
這樣就完成了 在線統(tǒng)計(jì)功能。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載