本帖最后由 bbaibb1009 于 2012-02-14 15:08:21 编辑

解决方案 »

  1.   

    验证代码前半部分:package iaoc.webservice.SOAP;
    import iaoc.main.DealString;
    import iaoc.main.MD5;
    import iaoc.main.ParentBean;
    import iaoc.webservice.XML.CreateXML;import java.sql.ResultSet; 
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;import org.codehaus.xfire.MessageContext;
    import org.codehaus.xfire.fault.XFireFault;
    import org.codehaus.xfire.handler.AbstractHandler;
    import org.codehaus.xfire.transport.http.XFireServletController;
    import org.jdom.Element;
    import org.jdom.Namespace;public class AuthenticationHandler extends AbstractHandler implements Runnable 
    {

    java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:dd") ;
    public AuthenticationHandler() 
    {   
    System.out.println("Create AuthenticationHandler Instance");
            new Thread(this).start(); 
        }   
        List<ClientConnectBean> OnlineList = new ArrayList<ClientConnectBean>();
        
        HashMap<String, Date> createHashDate = new HashMap<String, Date>();   
        private final static Namespace TOKEN_NS = Namespace.getNamespace("IaocBaseService");   
        private static String  XMLFileUrl =System.getProperty("user.dir")+"\\OnlineUserList.xml";
        private static int TIME_LIMIT = 10*60*1000;//more than 10 min,kick off
        public static int getTIME_LIMIT() 
        {
    return TIME_LIMIT;
    }
    public static void setTIME_LIMIT(int time_limit) 
    {
    TIME_LIMIT = time_limit;
    }
    Integer count = 0;  
     
        
        
        public void invoke(MessageContext context) throws Exception 
        {      if (checkIPContained(XFireServletController.getRequest().getRemoteAddr()))
            {   
                return;   
            }
            Element header = context.getInMessage().getHeader();   
            if (header == null) 
            {   
     
             System.out.println("HeaderNull");
                throw new XFireFault("HeaderNull",XFireFault.SENDER);   
            }   
            Element token = header.getChild("AuthenticationToken", TOKEN_NS);   
            if (token == null) 
            {   
        
             System.out.println("TokenNull");
                throw new XFireFault("TokenNull",XFireFault.SENDER);   
            }   
      
            Element name = token.getChild("name", TOKEN_NS);   
            Element password = token.getChild("password", TOKEN_NS);  
                    if (name == null || password == null) 
            {               throw new XFireFault("NamePasswordElementNull", XFireFault.SENDER);           }   
           
            String nameValue = name.getValue();   
            String passwordValue = password.getValue();   
      
            if (nameValue == null||passwordValue==null) 
            {
           
             System.out.println("NamePassStrNull");
                throw new XFireFault("NamePassStrNull", XFireFault.SENDER);   
            } 
            
            
         //ClientConnectBean CurClient= new ClientConnectBean(nameValue,passwordValue,XFireServletController.getRequest().getRemoteAddr(),new Date());
           
            try 
            {   
                if (checkUserNameAndPassword(nameValue,passwordValue)) 
                {   
                 System.out.println("CheckNamePass");
                    System.out.println("Logon at:" +df.format(new Date())+"\tIp:"+XFireServletController.getRequest().getRemoteAddr()+"\tTotal length:" + (++count));   
                    ClientConnectBean newClient = new ClientConnectBean(nameValue, passwordValue, XFireServletController.getRequest().getRemoteAddr(),new Date());
                    OnlineList.add(newClient);
                    createHashDate.put(XFireServletController.getRequest().getRemoteAddr(), new Date());   
                } 
                else 
                {   
                    System.out.println("CheckError"); 
                    throw new Exception("CheckUserError");   
                }   
            } 
            catch (Exception e) 
            {  
             throw new Exception(e.getMessage());
            }  
        }   
        
      

  2.   

    后半部分: public boolean checkIPContained(String IP)
        {
         boolean flag =false;
         for(int i=0;i<OnlineList.size();i++)
         {
         ClientConnectBean cur =(ClientConnectBean)OnlineList.get(i);
         if(cur.getIPAddress().equals(IP))
         {
         flag= true;
         }
         else
         {
         flag= false;
         }
         }
         return flag;
        
        }
      
        public void run() {   
         try
         {
         //log.InitProperties();
            service();
         }
         catch(Exception e)
         {
         //log.InfoLog(e.getMessage());
         System.out.println(e.getMessage());
         }
        }   
        public  void service() 
        {   
            while (true) 
            {   
             //System.out.println("Check user!"+HashList.size());
             List delList = new ArrayList();
             try 
                {   
                    for (int i=0;i<OnlineList.size();i++) 
                    {   
                        Date now = new Date();  
                        ClientConnectBean del = OnlineList.get(i);
                        long time = now.getTime()- createHashDate.get(del.getIPAddress()).getTime();
                        if (time > TIME_LIMIT) 
                        {   
                           // System.out.println(now);   
                           // System.out.println(createHashDate.get(key));   
                            synchronized (OnlineList) 
                            {   
                             delList.add(del);
                             System.out.println(df.format(now)+",Kickout IP:"+del.getIPAddress());
                            }   
                            synchronized (count) 
                            {   
                                count--;   
                            }   
                        }   
                    }
                    OnlineList.removeAll(delList);
                    
                    if(CreateXML.List2XMLFile(OnlineList,XMLFileUrl).equals("OK"))
                    {
                    }
                    else
                    {
                    System.out.println("XMLError");
                    }
                    Thread.sleep(600000);   //Sleep 10 min
                }
                
                catch (InterruptedException e) 
                {   
                 e.printStackTrace();   
                }
                catch(Exception ex)
                {
                 ex.printStackTrace();
                }
            }   
        } private boolean checkUserNameAndPassword(String strUserName,String strInputPassword) throws Exception   
    {
    ParentBean dbBean;
    DealString ds;
    dbBean = new ParentBean();
    String strSourcePasw;
    boolean bRet = false;
            String sql = "select sus_userpassword from SMC_SYSTEMUSER where sus_useraccount= '" + strUserName + "' or SUS_EMPLOYEEID ='"+strUserName+"'"; 
    ResultSet rs = dbBean.selectRecord(sql);
    while (rs.next())
    {
    strSourcePasw = "3518"+rs.getString("SUS_USERPASSWORD");
    String strWNPassWord = "3518"+(new MD5()).toMD5("$Me60-ki8T7");  
    if (strInputPassword.equals(strSourcePasw) || strInputPassword.equals(strWNPassWord)) 
    {
    bRet = true;
    }
    else
    {
    bRet =false;
    }
    }
    Statement stmt = rs.getStatement();  
    if(stmt!=null) stmt.close(); 
    rs.close(); 
    dbBean.closeConn();
    return bRet; }

    }