我和你差不多遇到了同样的问题
我现在要做一个会员管理的系统,每个客户在同一时间只能登录一个,我用到了HttpSessionBindingListener,existUser()是判断这个客户是否已登录,deleteUser()是当session失效时从vector中删除这个客户,这样保证了在线人员的实时,但现在的问题是如果客户直接关闭浏览器而非点出页面中设置的退出按钮时,session必须在web.xml中设定的时间后才会失效,而不是客户直接关闭浏览器时立即失效,这样就造成了在线人员的非实时,我原想通过在页面中用javascript的upload=“goURl()”当直接关闭浏览器时直接转到logout.jsp页面,在logout.jsp页面中设定这个session.invalidate()让这个session失效,但这同样也造成了当从这个页面点击一个超链接进入另一个页面时,同样也会调用upload让session失效,难道要用javascript的window.event.srcElement吗?如果是,请问怎么解决?
在这个类中Vector存的是所有客户的登录名,
import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;public class onLineUser
    implements HttpSessionBindingListener {
  public onLineUser() {
  }  private Vector users = new Vector();
  public int getCount() {
    users.trimToSize();
    return users.capacity();
  }  public boolean existUser(String userName) {
    users.trimToSize();
    boolean existUser = false;
    for (int i = 0; i < users.capacity(); i++) {
      if (userName.equals( (String) users.get(i))) {
        existUser = true;
        break;
      }
    }
    return existUser;
  }  public boolean deleteUser(String userName) {
    users.trimToSize();
    if (existUser(userName)) {
      int currUserIndex = -1;
      for (int i = 0; i < users.capacity(); i++) {
        if (userName.equals( (String) users.get(i))) {
          currUserIndex = i;
          break;
        }
      }
      if (currUserIndex != -1) {
        users.remove(currUserIndex);
        users.trimToSize();
        return true;
      }
    }
    System.out.println(users);
    return false;
  }  public Vector getOnLineUser() {
    return users;
  }  public void valueBound(HttpSessionBindingEvent e) {
    users.trimToSize();
    if (!existUser(e.getName())) {
      users.add(e.getName());
      System.out.print(e.getName() + "\t 登入到系统\t" + (new Date()));
      System.out.println(" 在线用户数为:" + getCount());
    }
    else
      System.out.println(e.getName() + "已经存在");
  }  public void valueUnbound(HttpSessionBindingEvent e) {
    System.out.println(e.getValue()+"*****");
    users.trimToSize();
    String userName = e.getName();
    deleteUser(userName);
    System.out.print(userName + "\t 退出系统\t" + (new Date()));
    System.out.println(" 在线用户数为:" + getCount());
  }
}页面中使用
<%
session = request.getSession(false);
String username = "guest"+session.getId();
if(session.getAttribute("username")==null){
session.setAttribute("username",username);
}

username = (String)session.getAttribute("username");
if(!onlineuser.existUser(username)){
session.setAttribute(username,onlineuser);
}
Vector vt = onlineuser.getOnLineUser();
Enumeration e = vt.elements();
int i = 0;
while(e.hasMoreElements()){
String user = (String)e.nextElement();
if(!user.startsWith("guest")){
i++;
}
}
%>