2014-09-29 41 views
1

我有一個驗證代碼,與活動目錄交互並獲取一些信息。但我只想確保關閉連接並將其返回到池中。我怎樣才能確保他們?如何關閉與活動目錄的LDAP連接

這裏是我的代碼:

import java.util.Hashtable; 
import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.NamingException; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 
import javax.naming.ldap.InitialLdapContext; 
import javax.naming.ldap.LdapContext; 

public class LDAPExaminer { 

    public static void main(String[] args) { 
     LDAPExaminer ldapExaminer = new LDAPExaminer(); 
     // NOTE: replace theUserName below with the Active Directory/LDAP user whose attribites you want printed. 
     ldapExaminer.printUserBasicAttributes("<strong>theUserName</strong>", ldapExaminer.getLdapContext()); 
    } 

    public LdapContext getLdapContext() { 
     LdapContext ctx = null; 
     try { 
      Hashtable env = new Hashtable(); 
      env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
      env.put(Context.SECURITY_AUTHENTICATION, "Simple"); 

      // NOTE: replace [email protected] with a User that is present in your Active Directory/LDAP 
      env.put(Context.SECURITY_PRINCIPAL, "<strong>[email protected]</strong>"); 
      // NOTE: replace userpass with passwd of this user. 
      env.put(Context.SECURITY_CREDENTIALS, "userpass"); 
      // NOTE: replace ADorLDAPHost with your Active Directory/LDAP Hostname or IP. 
      env.put(Context.PROVIDER_URL, "ldap://ActiveDirOrLDAPHost:389"); 

      System.out.println("Attempting to Connect..."); 

      ctx = new InitialLdapContext(env, null); 
      System.out.println("Connection Successful."); 
     } catch (NamingException nex) { 
      System.out.println("LDAP Connection: FAILED"); 
      nex.printStackTrace(); 
     } 
     return ctx; 
    } 

    private void printUserBasicAttributes(String username, LdapContext ctx) { 
     try { 

      SearchControls constraints = new SearchControls(); 
      constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      // NOTE: The attributes mentioned in array below are the ones that will be retrieved, you can add more. 
      String[] attrIDs = { "distinguishedName", "sn", "givenname", "mail", "telephonenumber", "canonicalName", 
        "userAccountControl", "accountExpires" }; 
      constraints.setReturningAttributes(attrIDs); 

      // NOTE: replace DC=domain,DC=com below with your domain info. It is essentially the Base Node for Search. 
      NamingEnumeration answer = ctx.search("DC=YourDomain,DC=com", "sAMAccountName=" + username, constraints); 

      if (answer.hasMore()) { 
       Attributes attrs = ((SearchResult) answer.next()).getAttributes(); 
       System.out.println(attrs.get("distinguishedName")); 
       System.out.println(attrs.get("givenname")); 
       System.out.println(attrs.get("sn")); 
       System.out.println(attrs.get("mail")); 
       System.out.println(attrs.get("telephonenumber")); 
       System.out.println(attrs.get("canonicalName")); 
       System.out.println(attrs.get("userAccountControl")); 
       System.out.println(attrs.get("accountExpires")); 
      } else { 
       throw new Exception("Invalid User"); 
      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

回答

0

幾件事情

1)的Java LDAP graceful disconnect

2)儘量在適當的地方(S加入這個可能重複的)至少在一個捕獲和在主]

ctx.close(); 

如果你要保持這個功能基於,我會再寫一個把你的'主'代碼,包括close()。