在线用户列表实现的一种方案
2017-03-20 13:36
260 查看
最近项目中要用到这个功能,查询了许多资料并整理后,有了这个相对完善的方案:
同理,要实现valueUnbound,在注销模块添加:
1.建立接口实现类
由于项目不只要统计用户数,还要显示在线用户的相关信息,所以考虑用HttpSessionBindingListener接口。 此处我先建立HttpSessionBindingListener接口实现类package com.newcapec.crm.workbench.listener; import com.newcapec.crm.workbench.onlineList.LoginUser; import com.newcapec.crm.workbench.onlineList.OnlineUser; import javax.servlet.http.*; import java.util.*; public class OnlineCounterListener implements HttpSessionBindingListener { private OnlineUser newUser = null; private LoginUser loginUser = null; /** * 初始化 */ public OnlineCounterListener() { newUser = new OnlineUser(); loginUser = new LoginUser(); } /** * 用户上线 * * @param e */ public void valueBound(HttpSessionBindingEvent e) { String acct = (String) e.getSession().getAttribute("LOGIN_USER_ACCT"); String name = (String) e.getSession().getAttribute("LOGIN_USER_NAME"); loginUser.setAcct(acct); loginUser.setName(name); newUser.setLoginUser(loginUser); try { if (isInList(loginUser)) { newUser.updateOnline(); } } catch (Exception ex) { } System.out.println("用户账号"+acct+"已上线"); } /** * 用户下线 * * @param e */ public void valueUnbound(HttpSessionBindingEvent e) { String acct = (String) e.getSession().getAttribute("LOGIN_USER_ACCT"); String name = (String) e.getSession().getAttribute("LOGIN_USER_NAME"); loginUser.setAcct(acct); loginUser.setName(name); newUser.setLoginUser(loginUser); try { newUser.updateUnline(); } catch (Exception ex) { } System.out.println("用户账号"+acct+"已下线"); } /** * 判断该用户是否已登录 * * @param loginUser * @return 4000 */ public boolean isInList(LoginUser loginUser) { List list = OnlineUser.getList(); if (list.size() > 0) { for (int i = 0; i < list.size(); i++) { LoginUser myLogin = (LoginUser) list.get(i); if (myLogin.getAcct().equalsIgnoreCase(loginUser.getAcct())) return false; } } return true; } }
2.在系统中注册接口
在配置文件web.xml中添加如下信息:<listener> <listener-class>com.newcapec.crm.workbench.listener.OnlineCounterListener</listener-class> </listener>
3.激活方法
要使valueBound()方法在合适的时候执行,还需在用户登录模块来激活该方法:OnlineCounterListener sessionListener = new OnlineCounterListener(); request.getSession(false).setAttribute("listener", sessionListener);
同理,要实现valueUnbound,在注销模块添加:
session.invalidate();
4.用户实现类OnlineUser:
package com.newcapec.crm.workbench.onlineList; import java.util.ArrayList; import java.util.List; public class OnlineUser { private LoginUser loginUser = null; private static List list = new ArrayList(); //用来存放在线用户列表 public LoginUser getLoginUser() { return loginUser; } public void setLoginUser(LoginUser loginUser) { this.loginUser = loginUser; } public void updateOnline() { list.add(loginUser); } public void updateUnline() { list.remove(loginUser); } public static List getList() { return list; } }
5.用户实现类需要的基类LoginUser:
package com.newcapec.crm.workbench.onlineList; public class LoginUser { private String acct; //用户账号 private String name; //用户名字 public String getAcct() { return acct; } public void setAcct(String acct) { this.acct = acct; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
6.前台展示
到此,后台的准备都已做好,前台jsp页面的内容我用了easyUI:<table id="do" title="在线用户" class="easyui-datagrid" style="width:33%;height:280px;" url="${ctx}/workbench/onlineUser.json" toolbar="#toolbar" queryFilter="false" rownumbers="true" fitColumns="true" singleSelect="true"> <thead> <tr> <th data-options="field:'acct',width:100,align:'left'">用户</th> <th data-options="field:'name',width:100,align:'left'">姓名</th> </tr> </thead> </table>
相关文章推荐
- 在线用户列表实现的一种方案
- HuaXinIM聊项目优化(在线用户列表实现在线更新)
- 使用Application和SessionID实现在线用户列表统计
- Java实现app接口和Socket消息传递(11)获取在线用户列表
- 实现在线用户列表的简单方法
- FMS在线用户列表的实现
- 使用redis实现获取在线用户列表
- session、application事件监听器实现在线用户列表
- 第五天 CSDN (复习、聊天室、实现在线用户列表)
- HuaXinIM聊项目阶段总结四(在线用户列表与聊天窗口的实现)
- 浅析 Community Server 在线用户列表与位置跟踪实现机制[原创]
- [原创]jsp实现在线用户列表方法
- 抛砖引玉-使用Acegi实现多种用户登录的一种方案
- jsp实现在线用户列表显示
- Java Web防止用户重复登录(同一用户同时登录)的一种实现方案
- 用户对列表实现自定义排序实现方案
- 单例模式实现在线用户列表
- 使用Acegi实现多种用户登录的一种方案
- asp 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统
- 使用Application和SessionID实现在线用户列表统计