在线用户列表奇怪问题请教!
由于项目不只要统计用户数,还要显示相关在线用户的信息,所以考虑用HttpSessionBindingListener接口。
该接口包含了valueBound()和valueUnbound()两个方法,分别可以对创建session和注销session、session过期做出响应。
此处建立HttpSessionBindingListener接口实现类。
现在是用户登陆和正常退出都可以侦测出来,在服务运行的本机上如果非正常退出(直接关闭IE),超过session默认timeout后,也会掉出去。但问题是如果是从其他机器访问服务机,非正常退出后一直无法从session中清除掉,这是怎么回事??
代码奉上:
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;
}
}