📄 统计在线人员列表.txt
字号:
在线用户列表的写法近日项目中要用到这个功能,查阅很多资料后,总结如下。由于项目不只要统计用户数,还要显示相关在线用户的信息,所以考虑用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秒 后服务器超时,可以用来测试该情况。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -