java中如何实现同一账号不能同时登录

经过两天的研究,下面给两个方法.不个是webwork版本的,一个是修改过后的网上的意见监听器版本的

 (一)   首先先上自己的研究成果

      1:首先在baseAction 中或者直接在action中写一个方法,和一个静态map(保存唯一的session)

         静态map

     

Java代码  收藏代码
private static Map<String, HttpSession> httpssessionmap = new Hashtable<String, HttpSession>(); //避免重复登录  
 

 

    2:主方法(给一个返回值是为了给提示) 

  

   

Java代码  收藏代码
public Integer loginMethod(LoginInfo loginfo,Users user) throws Exception{  
        int returnnum=0;  
        if(httpssessionmap.containsKey(user.getUser_code())){  
            //qztc_LogInfo(user, (String)httpssessionmap.get(user.getUser_code()).getAttribute(LOGIN_IP));  
            try{//获取session   
            logger.info("因在其它地方重新登录被系统强制退出");  
            httpssessionmap.get(user.getUser_code()).removeAttribute(LOGIN_INFO);             
            }catch(Exception e){  
                e.printStackTrace();  
            }  
            httpssessionmap.remove(user.getUser_code());  
            if (pcount > 0)  
                pcount--;  
            Thread.sleep(10);  
            returnnum=1;  
        }  
        set(LOGIN_INFO,loginfo);  
        //set(LOGIN_INFO, new LoginInfo(user));  
        //set(LOGIN_IP, this.getIPAddress());         
        httpssessionmap.put(user.getUser_code(), getHttpSession());  
        pcount++;  
        info(getLogPrex_().append("进入系统").toString());  
        //info(this.LOG_TYPE_LONGIN, "进入系统");  
        return returnnum;  
    }  
 

      3:获得登录用户的唯一session

     

Java代码  收藏代码
protected HttpSession getHttpSession(){  
    return ServletActionContext.getRequest().getSession();  
   }  
 

       4:set方法,设置session

   

Java代码  收藏代码
protected void set(String name, Object value)  
   {  
       ActionContext.getContext().getSession().put(name, value);  
   }  
  

    5:说明:   最后可以在 用户登录的action中 调这个baseaction方法...接下来该干嘛干嘛去..

 

 

(二) 网上哥们给的意见 http://sunxin.org/forum/thread/22787.html(回帖的用户"钟爱java ")  应该是忘记session失效的问题了.

           

   先上代码(代码整理得我都吐血了.)  --接下来都是原话

 

SessionListener.java监听session的类,部署于/App/WEB-INF/classes/com/test下(其中App为你的应用程序目录)

 


Java代码  收藏代码
 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,LoginInfo loginfo){      
         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;               
                 ((ActionContext) session).put(LOGIN_INFO, loginfo);  
                 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;        
 }   
 }   
 

 

web.xml部署于/App/WEB-INF下



Xml代码  收藏代码
<?xml version="1.0" encoding="ISO-8859-1"?>   <!DOCTYPE web-app   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd">    
  
<web-app>   
  <listener>   
  <listener-class>     
com.inspirer.dbmp.SessionListener    
 </listener-class>    
 </listener>   
  </web-app>   
 应用部分

1.在你的登录验证时,调用SessionListener.isAlreadyEnter(session,"admin")

既可以判断该用户名的用户是否登录过,又可以使上次登录的用户掉线

2.其他页面调用SessionListener.isOnline(session),可以判断该用户是否在线.

 
原文地址:https://www.cnblogs.com/xianz666/p/13817366.html