zoukankan      html  css  js  c++  java
  • 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),可以判断该用户是否在线.
    
     
  • 相关阅读:
    闭包的最准确的解释-待翻译
    undefined 和 null 的异同
    Javascript深度克隆一个对象
    产品培训的经验
    JavaScript库开发者们的规则
    IOS ——UI篇—— UITableView的常用属性及代理方法的用法总结
    IOS ——UI篇—— 自定义UITableViewCell的方法
    IOS ——UI篇—— UIScrollView的用法总结
    使用UIKit中的tag属性要注意的
    IOS ——UI篇——UITabBarController的基本用法
  • 原文地址:https://www.cnblogs.com/xianz666/p/13817366.html
Copyright © 2011-2022 走看看