您的位置:首页 > 其它

在线用户统计

2008-08-29 10:54 225 查看
在线用户列表的写法
近日项目中要用到这个功能,查阅很多资料后,总结如下。
由于项目不只要统计用户数,还要显示相关在线用户的信息,所以考虑用HttpSessionBindingListener接口。
该接口包含了valueBound()和valueUnbound()两个方法,分别可以对创建session和注销session、session过期做出响应。
此处我们建立HttpSessionBindingListener接口实现类

package com.sscm.common.organization;

import javax.servlet.http.*;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.*;
import com.retop.scm.common.*;

public class OnlineCounterListener implements HttpSessionBindingListener{
private OnlineUser newUser=null; //OnlineUser是用户类

/**
* Constructor for OnlineCounterListener.
*/
public OnlineCounterListener() {
newUser = new OnlineUser();
}

public void valueBound(HttpSessionBindingEvent e){
ScmLogin scmLogin = (ScmLogin)e.getSession().getAttribute("ScmLogin");
newUser.setScmLogin(scmLogin);
try {
if(isInList(scmLogin))
newUser.updateOnline();
}
catch (Exception ex) {
}
//System.out.println("用户"+e.getSession().getAttribute("ScmLogin")+"上限");
}

public void valueUnbound(HttpSessionBindingEvent e){
ScmLogin scmLogin = (ScmLogin)e.getSession().getAttribute("ScmLogin");
newUser.setScmLogin(scmLogin);
try {
newUser.updateUnline();
}
catch (Exception ex) {
}
//System.out.println("用户"+e.getSession().getAttribute("ScmLogin")+"下限");
}

public boolean isInList(ScmLogin scmLogin){
List list = OnlineUser.getList();
if(list.size()>0){
for(int i=0;i<list.size();i++){
ScmLogin myLogin = (ScmLogin)list.get(i);
if(scmLogin.getUserID().equalsIgnoreCase(myLogin.getUserID()))
return false;
}
}
return true;
}
}

该类要在系统中注册,我用的是Websphere,所以只需在web.xml中添加
listener>
<listener-class>com.sscm.common.organization.OnlineCounterListener</listener-class>
</listener>
来注册该类。
另外,要实现valueBound()方法,还需在用户登陆模块来激活该方法,
OnlineCounterListener sessionListener=new OnlineCounterListener();
request.getSession(false).setAttribute("listener",sessionListener);
此处注册了listener,相当于后台多了一个session监听器。
同理,要实现valueUnbound,在注销模块添加:
session.removeAttribute("listener");
来注销该用户session即可。

再来看用户实现类
package com.retop.scm.common;

import java.util.*;

public class OnlineUser {
private ScmLogin scmLogin = null ;
private static List list=new ArrayList(); //用来存放在线用户列表

/**
* Returns the scmLogin.
* @return ScmLogin
*/
public ScmLogin getScmLogin() {
return scmLogin;
}

/**
* Sets the scmLogin.
* @param scmLogin The scmLogin to set
*/
public void setScmLogin(ScmLogin scmLogin) {
this.scmLogin = scmLogin;
}

public void updateOnline(){
list.add(this.scmLogin);
}

public void updateUnline(){
list.remove(this.scmLogin);
}

public static List getList(){
return list;
}
}

将在线用户信息放在一个static的list中。
此处还用到一个用户的基类ScmLogin,
public class ScmLogin {
private String UserID;
private String RealName;
private Integer OrgID;
private String OrgName;
private String OrgCode; //add by starrain.tian 2003.12.17
private java.sql.Timestamp loginTime; //add by starrain.tian 2004.11.10
private String ip;
.....
setXX,getXX.....
}
在用户登录模块,只需把ScmLogin放入session即可。
mysession.setAttribute("ScmLogin",mylogin);

最后在实现页面,即访问的jsp页面里,
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import= "java.util.*"%>
<%@ page import="com.sscm.common.organization.OnlineCounterListener" %>
<%@ page import ="com.retop.scm.common.*" %>
<html>
<head>
<title>在线用户</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../ScmStyle.css" type="text/css" media="screen"/>
</head>

<body>
<%
//session.setMaxInactiveInterval(20);
List list = OnlineUser.getList();
%>
<TABLE style="width:100%;" cellSpacing="0" cellPadding="0" border="0">
<tr>
<TD width="13%" align="left"><img src="../images/w1.gif"><FONT color="#2f47cc">
在线用户列表
   
当前在线用户<%=list.size()%>人</FONT> </TD>
</tr>
<tr><td height="6"> </td></tr>
</Table>

<table class="DbGridStyle" cellspacing="1" cellpadding="4" rules="all" border="1" id="comlist" style="width:100%;">
<tr class="GridHeadStyle" nowrap align="Center">
<td><div align="center">用户ID</div></td>
<td><div align="center">用户名称</div></td>
<td><div align="center">所属组织</div></td>
<td><div align="center">登录时间</div></td>
<td><div align="center">用户IP</div></td>
</tr>
<%
for(int i=0;i<list.size();i++) {
ScmLogin myLogin = (ScmLogin)list.get(i);
%>
<tr class="ItemStyle">
<td><%=myLogin.getUserID()%></td>
<td><%=myLogin.getRealName()%></td>
<td><%=myLogin.getOrgName()%></td>
<td>
<%String loginttime=(String)myLogin.getLoginTime().toString().substring(0,16);out.println(loginttime);%>
</td>
<td><%=myLogin.getIp()%></td>
</tr>
<%
}
%>
</table>
</body>
</html>

这样就可以得到在线用户信息。

在实际测试当中,对用户直接关闭浏览器情况,可以对服务会话进行设置,在web.xml中添加
<session-config>
<session-timeout>20</session-timeout>
</session-config>

表示20秒 后服务器超时,可以用来测试该情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: