对于登录信息时使用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;
} |