在线用户列表实现的一种方案

最近项目中要用到这个功能,查询了许多资料并整理后,有了这个相对完善的方案:

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
*/
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>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值