我想要实现只要这个帐号一登录,其他的人再使用这个帐号不论是在本机还是其他机子上的都不能再使用登录了,除非注销登录,其他人可以使用。
我在网上找了很多,但是都说的不是很清楚,有的是通过记录session来判断的,有的是结合数据库实现的,但是都存在一个问题,如果要是机子断电,或者个alt+f4,或者是直接点浏览器的叉这样子的关闭,就清除不了 session的值,或者是改变不了数据库中用户的登录状态,恳请高人指点,最好可以附上代码。

解决方案 »

  1.   

    可以提供lz一个思路在应用程序启动时建立一个静态map存储用户id,当有用户登录时,查看map中是否存在该用户,如果存在就不许用户登录,如果不存在就允许用户登录。
    在html页面上使用ajax做一个心跳,每个一定时间向服务器提交一次,代表用户正在登录,如果过了一定的时间还是没有心跳认为用户已经下线,把用户id从map中删除,用户就可以再次登录。
    对于map的操作需要同步。
      

  2.   

    可以用application去管理啊
      登录的时候, 设置一个值, 再次登陆的 时候判断application里面是否有这个相对应的值
      

  3.   

    我也有个思路,创建一个session的同时,记录下ip和用户名作关联,服务器创建一个静态域,状态可以保持到用户正常退出。
    再有登录,首先验证这个空间里的用户,如果请求IP不同则不允许,反之则允许登录!可以有效防止alt+f4和断电的情况出现的拒绝登录问题。但是这个静态域又不等同于一楼说的那种长效的,具体点可以用一个独立运行的线程维护他的状态!设置一个退出前无操作状态下默认退出的时间,相当于一个队列,用户每次的请求相当于一个心跳(不用单独发送心跳),去更新这个等待时间,当两次请求间隔时间大于或等于这个时间值,假如用户名IP一致,则默认其在线状态。否则拒绝其操作,必须再次使用密码登录!当然要清除这个空间中的信息。简单说,超时时间内是在线的,重新登录的情况只有两种:用户正常退出和超出安全时间范围!
      

  4.   

    浏览器关闭,会话关闭,session关闭。
      

  5.   

    怎么做一个ajax的心跳啊?什么意思呢?具体要怎么做?
      

  6.   

    登录时,数据库记录下当前登录的sessionId
    创建一个监听器,在session失效时解除数据库的登录状态(应对直接关闭浏览器的情况)
    如果要做到强制前一个用户下线可以采用过滤器,当后面用户登录时发现该用户已经登录,在内存中记录sessionId,再在过滤器里面判断如果和当前sessionId相同时,强制session失效。
      

  7.   

    保存用户名到session对象,同时在数据库中做标记,在别人注销或者session对象销毁的时候改变数据库里面的标记,每次登陆的时候可以通过数据库里面的标记进行判断
      

  8.   

    public class OnlineUser implements HttpSessionListener{    
            
        private static HashMap<String, User> hUserName = new java.util.HashMap<String, User>();//保存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(User vo){    
            boolean flag = false;    
            if(hUserName.containsValue(vo)){    
                flag = true;    
            }else{//如果该用户没登录过,直接添加现在的sessionID和username    
                flag = false;    
            }    
            return flag;    
        }    
            
        /*   
         * isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法   
         * @param sUserName String-登录的用户名称   
         * @return boolean-该用户是否已经登录过的标志   
         */        
        public static boolean updateAlreadyEnter(HttpSession session,User vo){    
            boolean flag = false;    
            if(hUserName.containsValue(vo)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中)    
                //遍历原来的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(val.equals(vo)){    
                        iter.remove();    
                    }    
                }    
                hUserName.put(session.getId(),vo);//添加现在的sessionID和username    
                flag = true;    
            }else{//如果该用户没登录过,直接添加现在的sessionID和username    
                flag = false;    
                hUserName.put(session.getId(),vo);    
            }    
            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;    
        }       
            
    }  当时想实现这个功能,没有成功,这儿只有我找到的代码,希望楼主实现后把代码帖出来共享给大家。
      

  9.   

    使用memcache来存放已经登陆的用户信息 以用户名作为key值 当登陆的时候用用户名去memcache中查找 如果存在就提示 帐号不能重复登陆。  关于memcache
      

  10.   

    可以看下spring security的source,看看它是怎么实现会话管理的
      

  11.   

    好多种方式。。其实就是当某一个用户登陆时把他存到一个共享中。。当另一个人想登陆时,,就看这个其享中是否这个人还在,如果不在就登陆,如果还在则不让登陆。session  --》当一个用户登陆时就创建一个session 所以不能单单靠session来完成所以用一个静态的HashMap 是很不错的想法。memcached 缓存也是一个不错的想法至于memcached 的使用。
    http://blog.csdn.net/nihaozhangchao/archive/2010/04/06/5453311.aspx一个不错的文章存到数据库也是一个办法。不过需要付负一定的资源。。所以成于不成还要看自己怎么想怎么办。。