在线用户列表奇怪问题请教!

kaibinsj 2004-12-22 09:03:37
由于项目不只要统计用户数,还要显示相关在线用户的信息,所以考虑用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;
}
}



...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaibinsj 2004-12-27
  • 打赏
  • 举报
回复
应该是我部署listener的问题,换到windows上就没有问题了,重新打包发布一下试试。
lijunjiejava 2004-12-22
  • 打赏
  • 举报
回复
我就是说我的没有问题啊。
但是你给的信息应该说不清楚。
也没有办法帮你测试阿
kaibinsj 2004-12-22
  • 打赏
  • 举报
回复
这个差别不大,问题是我的程序在本机访问没问题,
其他人访问我机子,用户就掉不出去,这是什么原因了。
lijunjiejava 2004-12-22
  • 打赏
  • 举报
回复
最近一个项目中用jsp实现用户登录,当然是使用session来保持。这个用implements HttpSessionBindingListener接口来实现,这个是我写的简要代码。
public class OnLineUser implements HttpSessionBindingListener {
private NewUser newUser=null;
public OnLineUser() {
newUser=new NewUser();
}


public boolean existUser(String str)
{
return false;
}

public void valueBound(HttpSessionBindingEvent e) {
String tempName=e.getName();
//Integer m=new Integer(tempName);
newUser.setUserName(tempName);
try {
newUser.updateOnline();
}
catch (Exception ex) {
}
System.out.println("用户"+tempName+"上限");
}

public void valueUnbound(HttpSessionBindingEvent e) {
String tempName=e.getName();
//Integer m=new Integer(tempName);
newUser.setUserName(tempName);
try {
newUser.updateUnline();
}
catch (Exception ex) {
}
System.out.println("用户"+tempName+"下限");
}
}

在登录处理的servlet中调用
OnLineUser onLineUser=new OnLineUser();
request.getSession(false).setAttribute(login_no,onLineUser);
其中login_no是变量是登录名称。同时要把request.getSession(false)值设为false,他有true和false两个值,true为如果如果没有相同的session则创建。如果有则覆盖,false则没有则创建有则不创建,我要用这个实现单点登录所以用了false。这样就可以监听你创建的session了。如果session超时,则执行valueUnbound方法。创建session则执行valuebound方法。我在这里是对人员的一个状态字段进行更改。这样当这个用户在线的时候,另一个用户在另外的机子上线时在登录页面我就可以进行判断了。这方面的资料网上有很多,后来遇到问题就是当设置session超时时间为1分钟时。用户不正常退出可以一分钟后可以正常改变用户下线状态,但是用户如果1分钟内电脑没有操作也同时会吊线,我在网上找了很长时间,没有这方面的资料。后来我用我的一个框架(我的程序用的是框架,我用的是底部框架)
javax.servlet.http.HttpSession session2 = request.getSession(false);
com.chinantn.oa.util.OASession oasession =
(com.chinantn.oa.util.OASession) session2.getAttribute("oasession");
这个是我的登录页面用的一个处理session的类。然后在这个页面中加入
<meta http-equiv="refresh" content="30;URL=foot.jsp">.做成自动刷新。
间隔时间小于session超时时间。主要目的是如果页面在超时时间内没有访问的话用这个自动刷新访问一下session这样来解决问题。


http://blog.csdn.net/lijunjiejava/archive/2004/11/05/169078.aspx

--------------------
我用的这个方法解决的。和你有些差别。大体一样。
希望对你有些帮助
kaibinsj 2004-12-22
  • 打赏
  • 举报
回复
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;
}
}

将用户信息放在list中返回。
kaibinsj 2004-12-22
  • 打赏
  • 举报
回复
o,i forgot to say, i use the Solaris System,
Is it different with the windows?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧