LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2994|回复: 11

用session监听实现在线统计

[复制链接]
发表于 2004-8-3 19:02:09 | 显示全部楼层 |阅读模式
首先编写一个模型类[如果还需要其他信息可增加类属性]:

  1. package com.bupticet.listener;

  2. public class OnlineModel{
  3.   private String userName;
  4.   private String ipAddress;
  5.   private String loadTime;
  6.   private String address;

  7.   /**
  8.    * OnlineModel
  9.    */
  10.   public OnlineModel() {
  11.   }

  12.   public OnlineModel(String name,String ip,
  13.                      String time,String address){
  14.     this.userName = name;
  15.     this.ipAddress = ip;
  16.     this.loadTime = time;
  17.     this.address = address;
  18.   }


  19.   public String getIpAddress() {
  20.     return ipAddress;
  21.   }

  22.   public String getAddress() {
  23.     return address;
  24.   }

  25.   public String getLoadTime() {
  26.     return loadTime;
  27.   }

  28.   public void setUserName(String userName) {
  29.     this.userName = userName;
  30.   }

  31.   public void setIpAddress(String ipAddress) {
  32.     this.ipAddress = ipAddress;
  33.   }

  34.   public void setAddress(String address) {
  35.     this.address = address;
  36.   }

  37.   public void setLoadTime(String loadTime) {
  38.     this.loadTime = loadTime;
  39.   }

  40.   public String getUserName() {
  41.     return userName;
  42.   }

  43.   public String toString(){
  44.     return this.userName+"    "+this.ipAddress+"    "+this.loadTime+"    "+this.address+"\n\n"+"<br>";
  45.   }



  46. }

复制代码


再写一个session监听类,实现HttpSessionListener接口:

  1. package com.bupticet.listener;

  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import java.util.*;

  5. public class OnlineList implements HttpSessionAttributeListener{
  6.         private static List list=new ArrayList();

  7.         public void attributeAdded(HttpSessionBindingEvent se){
  8.                 if("online".equals(se.getName()))        {
  9.                         list.add((OnlineModel)(se.getValue()));
  10.                 }
  11.         }

  12.         public void attributeRemoved(HttpSessionBindingEvent se){
  13.                 if("online".equals(se.getName())){
  14.                         list.remove((OnlineModel)(se.getValue()));
  15.                 }
  16.         }

  17.         public void attributeReplaced(HttpSessionBindingEvent se){}

  18.         public static List getList(){
  19.                 return(list);
  20.         }
  21. }

复制代码


然后在web.xml中声明这个监听器:

  1. <listener>
  2. <listener-class>
  3. com.bupticet.listener.OnlineList
  4. </listener-class>
  5. </listener>
复制代码

最后在登陆的servlet或者页面中加入如下代码[请做适当修改]:

  1. java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
  2.                     String time = sdf.format(java.util.Calendar.getInstance().getTime());
  3.                     String[] address = IPLocalizer.search(request.getRemoteAddr());
  4.                     session.setAttribute("online",new OnlineModel(userName,request.getRemoteAddr(),time,address[0]+address[1]));
  5.                     
复制代码


这样就较为完美的实现了一个在线统计系统
 楼主| 发表于 2004-8-3 19:24:42 | 显示全部楼层

补充一下:显示在线统计:

[PHP]
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr class="tableHead" align=center>
        <td width='5%' nowrap>序号</a></td>
        <td width="0%">|</td>
        <td width='18%'>姓名</a></td>
        <td width="0%">|</td>
        <td width='20%'>IP</a></td>
        <td width="0%">|</td>
        <td width='30%'>登陆时间</a></td>
        <td width="0%">|</td>
        <td width='27%'>来自于</a></td>
        <td width="0%">|</td>
  </tr>
<%
java.util.List list=com.bupticet.listener.OnlineList.getList();
int onlineNumber = list.size();
int onlinePageCount = 0;
if(onlineNumber%pagesize==0){
        onlinePageCount = onlineNumber/pagesize;
}else{
        onlinePageCount = onlineNumber/pagesize+1;
}
String str = "";
String trbgcolor=Page_trbgcolor;

int i = (pageNum-1)*pagesize;
int j = 0;
for(;i<onlineNumber&&j<pagesize;i++,j++){
        com.bupticet.listener.OnlineModel om = (com.bupticet.listener.OnlineModel)(list.get(i));
        trbgcolor=(trbgcolor==Page_trbgcolor)?"#FFFFFF"age_trbgcolor;
         str+=" <tr  height='21' align='center' bgcolor='"+trbgcolor+"'>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+(i+1)+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+om.getUserName()+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+om.getIpAddress()+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+om.getLoadTime()+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+om.getAddress()+"</font></td>"+"\n";
           str+="<td width='0%'></td></tr>"+"\n";
}
for(;j<pagesize;j++){
                trbgcolor=(trbgcolor==Page_trbgcolor)?"#FFFFFF"age_trbgcolor;
         str+=" <tr  height='21' align='center' bgcolor='"+trbgcolor+"'>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+"&nbsp;"+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+"&nbsp;"+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+"&nbsp;"+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+"&nbsp;"+"</font></td>"+"\n";
           str+="<td width='0%'></td>"+"\n";
       str+="<td nowrap><font color='"+Page_warncolor+"'>"+"&nbsp;"+"</font></td>"+"\n";
           str+="<td width='0%'></td></tr>"+"\n";

}
%>
</table>[/PHP]
发表于 2004-8-9 19:56:31 | 显示全部楼层
good!good!
但是有一个问题,什么时候调用
com.bupticet.listener.OnlineList.attributeAdded(HttpSessionBindingEvent se)
什么时候调用
com.bupticet.listener.OnlineList.attributeRemoved(HttpSessionBindingEvent se)
我对监听这里不太清楚!
发表于 2004-8-10 10:40:47 | 显示全部楼层
当session有事件触发时(也就是session有动作时)会自动调用,不用刻意去关心的。。。
发表于 2004-8-10 16:40:15 | 显示全部楼层
是不是还要在web.xml里设置一下session失效的时间间隔?
发表于 2004-8-10 17:36:46 | 显示全部楼层
最初由 yyyyyy 发表
是不是还要在web.xml里设置一下session失效的时间间隔?

session有个默认的失效时间,好像是90s
发表于 2004-8-10 20:43:13 | 显示全部楼层
最初由 iDay 发表
session有个默认的失效时间,好像是90s


不是1800s 吗??
发表于 2004-8-11 09:30:51 | 显示全部楼层
在tomcat里可以配置web.xml
  <session-config>
    <session-timeout>240</session-timeout>
  </session-config>

session监视有一定的误差
发表于 2004-8-11 11:40:19 | 显示全部楼层

默认是1800吧。。。

session.setMaxInactiveInterval(...)
 楼主| 发表于 2004-8-11 12:18:00 | 显示全部楼层
我的网站页面里面分多个frame,有一个frame每隔20s刷新一次,所以我的web服务器和web.xml设置的session-timeout都是1分钟,这样统计就比较及时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表