如果用户不多,可以这样做:
做一个全局的用户管理器,假设用户第一次登录(或者注销后登录),管理器当中是没有用户信息的,管理器就把这个用户的相关信息记录下来(比如sessionId,最后登录时间)。
假设用户再次登录,管理器就比较用户信息。如果用户的sessionId一致,说明用户未注销又再次登录,那么就提示他先注销。如果用户的sessionId不一致,说明用户换了机器或者关闭了浏览器,那么就用现在的信息替代原先的信息。记得让以前的session失效。

解决方案 »

  1.   

    转:http://www.maocom.com/resources/program/html/200681/6025.htm
    1、用户的登陆信息保存在session中。
    登陆时先根据用户名去查找session的,如果该用户名的session存在,就说明该用户已经登 
    陆了,此时你可以定制自己的登陆规则,是优先原则或者是后者优先原则即可以。
    2、在数据的用户帐户表中加如个状态字段,比如0表示已经登陆,1表示没有登陆,只要帐户一登陆系统就设置标志位值为1,退出时则置为0上面说的两种方法都存在一些问题,,比如表加状态位,当不正当退出的时候,怎么去恢复状态位,必须要解决,否则出现这种情况之后该帐户就被锁定了。最好的方法是两种方法结合一起使用
      

  2.   

    用户登录后,将相关信息保存在context里,并在SessionListener的detroyed()方法中实现清除context中相关用户信息的功能。
    用户每次登录时,都要到context里查找是否有相关信息,有则提示登陆失败。
      

  3.   

    简单,把ip地址记录下来然后加上登陆时间,一起放在application中,下次登陆的时候比较。如果ip不同则改变,如果ip相同则比较登陆时间。
      

  4.   

    将登陆用户对象放到一个static HashMap中,登陆的时候检查该MAP中是否有同名的USERNAME放出实现代码import java.util.*;
    import javax.servlet.http.*;
    public class OnlineUser implements HttpSessionListener,java.io.Serializable{
      private static ReadWriteLock lock=new ReadWriteLock();
      private static HashMap name_session = new HashMap();
      private static HashMap UserMap = new HashMap();   public static int getUserCount(){
        lock.acquireReadLock();
        try{
          return UserMap.size();
        }finally{
          lock.releaseReadLock();
        }
      }   public static UserForm getUser(String sessionID){
        lock.acquireReadLock();
        try{
          return (UserForm)UserMap.get(sessionID);
        }finally{
          lock.releaseReadLock();
        }
      }   public static void addUser(String sessionID,UserForm user){
        lock.acquireWriteLock();
        try{
          //先删除前面一次登陆的该用户对象
          UserMap.remove(name_session.get(user.getLOGINNAME()));
          name_session.remove(user.getLOGINNAME());
          //再添加新的用户
          UserMap.put(sessionID,user);
          name_session.put(user.getLOGINNAME(),sessionID);
        }finally{
          lock.releaseWriteLock();
        }
      }   public static void addUser(HttpSession session,UserForm user){
        lock.acquireWriteLock();
        try{
          //先删除前面一次登陆的该用户对象
          UserMap.remove(name_session.get(user.getLOGINNAME()));
          name_session.remove(user.getLOGINNAME());
          //再添加新的用户
          UserMap.put(session.getId(),user);
          name_session.put(user.getLOGINNAME(),session.getId());
        }finally{
          lock.releaseWriteLock();
        }
      }   public static boolean existUserByLoginName(String LOGINNAME){
        lock.acquireReadLock();
        try{
          return name_session.containsKey(LOGINNAME);
        }finally{
          lock.releaseReadLock();
        }
      }   public static boolean existUserBySessionID(String sessionID){
        lock.acquireReadLock();
        try{
          return UserMap.containsKey(sessionID);
        }finally{
          lock.releaseReadLock();
        }
      }   public static void deleteUser(String sessionID){
        lock.acquireWriteLock();
        try{
          name_session.remove(UserMap.get(sessionID));
          UserMap.remove(sessionID);
        }finally{
          lock.releaseWriteLock();
        }
      }   public static void deleteUserByLOGINNAME(String LOGINNAME){
        lock.acquireWriteLock();
        try{
          UserMap.remove(name_session.get(LOGINNAME));
          name_session.remove(LOGINNAME);
        }finally{
          lock.releaseWriteLock();
        }
      }   public static boolean SessionExist(HttpSession session){
        lock.acquireReadLock();
        try{
          return UserMap.containsKey(session.getId());
        }finally{
          lock.releaseReadLock();
        }
      }   public void sessionCreated(HttpSessionEvent se){
        System.out.println(se.getSession().getId()+" 登入到系统 "+new Date());
      }   public void sessionDestroyed(HttpSessionEvent se){
        lock.acquireWriteLock();
        try{
          name_session.remove(UserMap.get(se.getSession().getId()));
          UserMap.remove(se.getSession().getId());
        }finally{
          lock.releaseWriteLock();
        }
        System.out.println(se.getSession().getId()+" 退出系统 "+new Date());
      }   public static Iterator userMap(){
        lock.acquireReadLock();
        try{
          return UserMap.values().iterator();
        }finally{
          lock.releaseReadLock();
        }
      }
    }
    下面是同步锁public class ReadWriteLock{
        private int readers=0;  //读线程计数器
        private boolean writingInProgress = false; //写操作标记
        private boolean waitingWriter = false;  //等待写操作的标记     public ReadWriteLock(){ }     public synchronized void acquireReadLock(){
          while(writingInProgress||waitingWriter==true){
            try{
              wait();
            }catch (InterruptedException ie) { /* ignore */ }
          }
          readers++;
        }     public synchronized void releaseReadLock(){
          readers--;
          if (readers == 0) { //没有人在读操作,通知可能等待着的写操作线程
            //notify();
            notifyAll();
          }
        }     public synchronized void acquireWriteLock(){
          while(readers>0||writingInProgress){
            try{
              waitingWriter = true;
              wait();
            }catch(InterruptedException ie){ /* ignore */ }
          }
          writingInProgress = true;
          waitingWriter = false;
        }     public synchronized void releaseWriteLock(){
          writingInProgress = false;
          notifyAll();
        }
      }
      

  5.   

    public synchronized void acquireReadLock(){
          while(writingInProgress||waitingWriter==true){
            try{
              wait();
            }catch (InterruptedException ie) { /* ignore */ }
          }
          readers++;
        } 
    不先notifyAll就wait要死锁的
      

  6.   

    用户登录以后 可以把用户名 保存在appliction里 当session销毁的时候。。在sessionDestroyed(HttpSessionEvent se) 方法里 把相关的ID 从application里删除。
    每次用户登录之前先判断下Application里是否有这个ID就好
      

  7.   

    在web应用中,如果一个a用户登录后,不能在别的地方再以a用户登录,很难实现不过如果改为别的地方再以a用户登录,原来的登录就失效了,这个容易
      

  8.   

    谢谢大家的建议,其实保存和判断用户是否登录不难,难就难在用户不正常退出时,怎么清除保存的用户信息,这点比较麻烦。
    采用 回复人:asklxf(xuefeng) ( 五级(中级)) 信誉:94
    应该更明智点
      

  9.   

    回复:tonyyl() ( ) 信誉:100    Blog 不会死锁,因为你担心的那种情况是不会发生。不知道LZ仔细看了代码没有,其实就是强制退出先前登陆的同名用户,这样比较合理
      

  10.   

    不正常退出 根本没办法判断。
    以前遇到过这样的需求,后来还是给delete掉了
    除了session过期。 似乎没更好的办法。
    除非你在客户端用ActiveX 或者是 Applet
      

  11.   

    TO:xlyyc(宇) ( ) 信誉:98 
    不好意思,开始没注意看,您说的对,谢了
    结帐了