在线用户统计

来源:互联网 发布:网络口碑营销 编辑:程序博客网 时间:2024/04/29 03:14

 在线用户列表的写法
近日项目中要用到这个功能,查阅很多资料后,总结如下。
由于项目不只要统计用户数,还要显示相关在线用户的信息,所以考虑用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">
      在线用户列表
   &nbsp;&nbsp;&nbsp;
  当前在线用户<%=list.size()%>人</FONT> </TD>
  </tr>
  <tr><td height="6">&nbsp;</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秒    后服务器超时,可以用来测试该情况。

 

原创粉丝点击