以下为在portal 6.1.5的主题中实现的在线用户统计的功能。具体使用是在门户主题目录里面创建一个onlinePersonCounterByMap.jsp文件,名称命名为其他的也可以,然后在该jsp里面添加统计的代码,具体代码如下:
<%@ page session="false" buffer="none" pageEncoding="gb2312"%>
<%@page import="javax.servlet.http.HttpSessionBindingListener"%>
<%@page import="java.util.TreeMap"%>
<%--
在valueBound中把当前登录的人员信息存储到SrvletContext
在valueUnbound中把当前退出的人员信息从ServletContext中除去
--%>
<%
if(request.getSession().getAttribute("com.ibm.wps.util.session_user")!=null)
{
if(request.getSession().getAttribute("onlinePersonSiger")==null)
{
request.getSession().setAttribute("onlineListener",new HttpSessionBindingListener()
{
private String onlineUserId="";
public void valueBound(HttpSessionBindingEvent event)
{
TreeMap onlineUserMap=null;
if (event.getSession().getServletContext().getAttribute("onlineusermap")==null)
{
onlineUserMap=new TreeMap();
}else
{
onlineUserMap=(TreeMap)event.getSession().getServletContext().getAttribute("onlineusermap");
}
if(event.getSession().getAttribute("com.ibm.wps.util.session_user")!=null)
{
com.ibm.wps.puma.User myuser=(com.ibm.wps.puma.User)event.getSession().getAttribute("com.ibm.wps.util.session_user");
onlineUserId=myuser.getUserID();
onlineUserMap.put(onlineUserId,myuser.getFullName());
}
event.getSession().getServletContext().setAttribute("onlineusermap", onlineUserMap);
}
public void valueUnbound(HttpSessionBindingEvent event)
{
TreeMap onlineUserMap=null;
if (event.getSession().getServletContext().getAttribute("onlineusermap")==null)
{
onlineUserMap=new TreeMap();
}else
{
onlineUserMap=(TreeMap)event.getSession().getServletContext().getAttribute("onlineusermap");
}
onlineUserMap.remove(onlineUserId);
event.getSession().getServletContext().setAttribute("onlineusermap", onlineUserMap);
}
});
request.getSession().setAttribute("onlinePersonSiger","onlinePersonSiger");
}
}//end if
%>
<%
//这部分用以输出在线人数
//或在其他需要输出在线用户数量的地方引用这段代码也可以
//若想输出有哪些用户在线,则输出该map里面的值即可
TreeMap onlineUserMap=null;
if (request.getSession().getServletContext().getAttribute("onlineusermap")!=null)
{
onlineUserMap=(TreeMap) request.getSession().getServletContext().getAttribute("onlineusermap");
out.println("<b>在线用户数量</b>:"+onlineUserMap.size()+"<br/>");
}else
{
out.println("null");
}//endif
%>
然后在门户主题的Default.jsp文件中引入该统计文件,引入方式为 :lt&; %@include file="./onlinePersonCounterByMap.jsp"%gt&;
与以往其他统计的方式相比有以下改进的地方:
一、不用打什么jar包和在web.xml添加监听器listener等之类操作,直接在主题中引用,方便
二、统计的记录方式是用TreeMap来记录登录人员的uid信息,比以往使用Integer的方式在session创建与销毁时增减1更精确。
具体:采用Integer在session创建与销毁时增加1和减去1.如果一个门户只有10个用户,若10个用户都登录上了portal,那么现在在线的用户是10,是对的,最大用户也只能是10个。但如果某一个用户在不同的机器或者不同的浏览器上面同时登录了多个,那么在现在在线的用户数就会大于10个了。依次类推。
采用TreeMap记录登录人员的uid的方式,则对于上述情况,无论登录多少台机器,多少个用户,则同一个用户都只会记录为一条记录。即登录了多少个用户账户信息,则就只有多少个用户在线。
其实这种在线统计方式只需稍作修改便可以在任何j2ee项目中都可以使用。