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),可以判斷該用戶是否在線.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM