您的位置:首页 > 其它

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

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

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: