我现在的思路是这样的  每个用户登陆之后都会session.setAttribute("user",user);  后面那个user对象存放的就是登陆用户的信息  监听器的 AttributeAdd()方法中  外面创建一个共有的属性 map来存放session信息  user的ID 为键  session为值   此时判断map.get(user.getId())是否为空  不为空 就说明  当前用户已经登陆  将之前的属性移除  然后讲新的session信息存入 map中     AttributeRemove()方法中  获得要删除的session  将他从map中移除   AttributeReplace()中 得到旧的信息  从map中移除  并对新session进行上面判断   看是否重新登陆  并存入map中   现在问题就用户不可能都是点退出登陆的方式来退出的 ,  有很多是直接关闭浏览器的方式来结束的   ,而关闭浏览器的话  session是不会直接被销毁的   也就是说通过监听的 sessiondestrory()方法是无法进行监听的   所以map就无法实时更新  求高手帮助!!!   或者通过其他的技术来实现  刚开始学  大多数技术不太熟悉  通常要实现我上面的功能在企业中都是如何实现的

解决方案 »

  1.   

    那就使用服务器端推的技术咯。建立服务器端与客户端的长连接。
    看下这个网站吧,对你有用
    http://www.ibm.com/developerworks/cn/web/wa-cometjava/index.html
      

  2.   

    你在关闭之前处理下session不就好了;
      

  3.   

    //删除session中的Form信息 
    session.removeAttribute( "FormName "); 
    //消除session 
    session.invalidate();
      

  4.   

    删除很简单  问题是你怎么知道他把浏览器给关了呢 服务器无法知道用户将浏览器关闭这个消息   所以找不到地方写清除session的方法
      

  5.   

    1: 实现在 HttpSessionBindingListener 接口 
         中的ValueBound 和valueUnBonud方法即可
    2: 定义  在线用户容器
         
        
      

  6.   

    还有8楼   你说的那个监听是监听对象绑定到session  上的    并监视浏览器关闭的功能  
      

  7.   

    这还真是个问题,session得不到释放会不会引起宕机?
      

  8.   

    浏览器关闭,session应该就自动销毁了吧!除非你没关浏览器,只是访问了其他网址,或是IE7,那样的多个窗口,只关了这个网站的页面,那样session还会存在
      

  9.   


    Lz 的思路虽好,但就像他自己说的那样,要用户关掉浏览器的时候是行不通的_ 外加一句,当用户反浏览器关掉时session是会销毁的.但是还存在你 Map 中!
    package com.eatsun.vo.power;import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;import com.eatsun.beans.OnLineUserContainer;
    import com.eatsun.vo.companyframe.PowerUserPermitVo;
    import com.eatsun.vo.hrmanager.HrMessageVo;
    import com.googlecode.jsonplugin.annotations.JSON;/**
     * 
     * @author tangyong [email protected] 09-07-07
     * @version 1.0
     * 
     */public class UserVo implements HttpSessionBindingListener { private OnLineUserContainer onLineUserContainer = OnLineUserContainer
    .getInstance(); /* 添加到session时调用 的方法 */
    public void valueBound(HttpSessionBindingEvent event) {
    System.out.println("executing...add...");
    // onLineUserContainer.addUser(this);
    addUser(this);
    } /* sessoin失效or 移出session调用的方法 */
    public void valueUnbound(HttpSessionBindingEvent event) { onLineUserContainer.removeUser(this);
    } private void addUser(UserVo addedUser) { if (onLineUserContainer != null
    && onLineUserContainer.getUserVector() != null
    && onLineUserContainer.getUserVector().size() > 0) { for (int i = 0; i < onLineUserContainer.getUserVector().size(); i++) { UserVo vo = onLineUserContainer.getUserVector().get(i); if (vo.getUserId().equals(addedUser.getUserId())) { onLineUserContainer.getUserVector().remove(i);
    }
    }
    }
    onLineUserContainer.getUserVector().add(addedUser);
    }}
    -------------------------------------------------------package com.eatsun.beans;import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionBindingListener;import com.eatsun.model.PowerUser;
    import com.eatsun.vo.power.UserVo;/**
     * 
     * @author [email protected]
     * 
     * <p>
     * 在线用户容器类 用来存当前在线的用户集合
     * </p>
     * 
     */
    public class OnLineUserContainer { private static final OnLineUserContainer onLineUserContainer = new OnLineUserContainer(); private Vector<UserVo> userVector; private OnLineUserContainer() {
    userVector = new Vector<UserVo>();
    } public static OnLineUserContainer getInstance() { return onLineUserContainer;
    } public void addUser(UserVo userVo) {
    if (userVo != null) {
    userVector.add(userVo);
    }
    } public void removeUser(UserVo userInteger) { if (userInteger != null) {
    userVector.remove(userInteger);
    }
    } public Vector<UserVo> getUserVector() { return userVector;
    }}
      

  10.   

    其实,你去看看jsp的监听器这个知识点就会知道了。
      

  11.   

    首先一点   用户管理浏览器是不会销毁session的  监听器的几种接口都是session发生变换的时候才会掉用监听的方法   但是一旦用户关闭浏览器之后  其实就应该在在线列表中删除用户的相关信息了  问题就是服务器端接收不到客户端用户关闭浏览器这个消息   所以服务器就会在session的存在时间到了之后才会执行销毁session的方法  而这样就无法实现需要实现的功能    目前知道一种方法  就是通过javascript监听关闭浏览器事件 通过Ajax 实现session的销毁   貌似只通过servlet的监听是无法实现这个功能的  求达人解这种说法的正确性   以及其他实现在线统计功能的方法  以及相关技术  列出大致技术即可  3Q
      

  12.   

    其实这个问题,在客户端监听关闭<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>点叉号触发</title>
    </head>
    <script type="text/javascript"> 
    window.onbeforeunload = function(){
    //here,you can do what you want to do!
    return "温馨提示,您确定要退出页面吗?";

    </script> 
    <body><div align="center" style="margin:100px;">点右上角的关闭,会有新发现。
    </div>
    </body>
    </html>
      

  13.   

    对  我上面提到了一种方法  就是楼上这种用JavaScript监听  然后通过Ajax实现服务器关闭session的操作  求解  是否还有其他的方法   
      

  14.   

    办法肯定是多。问题是有没有必要这么做.
    做软件讲究的是用最简单的办法去处理问题,而不是让问题更复杂话.用ajax 照你那么说当然可以 在客户端浏览器中 写function 
            setTimeOut(functionName,时间周期);在服务端保存 sessionId   .客户端定时发送信息过去。就像 你上班打卡一样.如果发现多长时间他没打卡[浏览器关闭了 or 其它情况] 这样。说明当前用户就不在线了。