package com.test;
import javax.servlet.http.*;
import java.util.*;public class SessionListener implements HttpSessionListener{
    private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
    /**以下是实现HttpSessionListener中的方法**/
    public void sessionCreated(HttpSessionEvent se){
    }
    
    public void sessionDestroyed(HttpSessionEvent se){
        hUserName.remove( se.getSession().getId() );
    }
    /*
     * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
     * @param sUserName String-登录的用户名称
     * @return boolean-该用户是否已经登录过的标志
     */
    public static boolean isAlreadyEnter(HttpSession session,String sUserName){
        boolean flag = false;
        if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)
            flag = true;
            //遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
            Iterator iter = hUserName.entrySet().iterator();
            while (iter.hasNext()) {
                Map.Entry entry = (Map.Entry)iter.next();
                Object key = entry.getKey();
                Object val = entry.getValue();
                if( ( (String)val ).equals(sUserName) ){
                    hUserName.remove(key);
                }
            }
            hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
            System.out.println("hUserName = " + hUserName);
        }
        else{//如果该用户没登录过,直接添加现在的sessionID和username
            flag = false;
            hUserName.put( session.getId(),sUserName );
            System.out.println("hUserName = " + hUserName);
        }
        return flag;
    }
    /*
     * isOnline-用于判断用户是否在线
     * @param session HttpSession-登录的用户名称
     * @return boolean-该用户是否在线的标志
     */
    public static boolean isOnline(HttpSession session){
        boolean flag = true;
        if( hUserName.containsKey( session.getId() ) ){
            flag = true;
        }
        else{
            flag = false;
        }
        return flag;
    }
}这个方法如何应用。如果用户的网页突然关闭网页,后再登陆还是不行。
如何判断用户已下线呢?这个方法是不是只能等session本身过期才触发sessionDestroyed事件??

解决方案 »

  1.   

    你可以把session过期时间设得短一点,或者干脆session由自己来管理不用交由应用服务器来管理,这样更方便,QQ使用socket连接可以实时检测出连接情况
      

  2.   

    用户关闭网页的情况需要你自己判断,用客户端脚本。但是这些脚本并不可靠。如果用户登录时,不允许重复多点登录,那么建议将session时间设置的短一点,自己通过别的方法来延续session。如果已经登录的用户再次登录时,先登录的自动登出,那么前面的session也就不必理会了。
    只要从那个session中删除登录标志即可。session可以被提前终结,详细信息请参看session对象的方法。
      

  3.   

    很简单的问题,不要想的那么复杂,记录一下登陆者的ip,如果ip相同就认为是同一个用户重复登陆否则就认为多用户用一个帐号。
      

  4.   

    记录ip的方法是不行的,如果他们都用代理上网,那只能一个人用。
    比如一个公司,一般是有一个路由器,大家都用那个上网,而一般jsp的api函数只能得到那个路由的ip,那其他人就用不了了
      

  5.   

    在数据库表中设置一个字段来表示用户状态
    或者在用户登陆的时候将他的用户名放到application中
      

  6.   

    除了这几种方法,还有没有其它的方法呢?
    session 太短不好,客户有意见。绑定ip也不行,因为IP是不固定的。关注
      

  7.   

    菜菜有个问题问问 
    hUserName的类容最后保存在那我怎么看不到。
    会不会和会话一样 一会就失效了没有了!