2012-07-03 11 views
11

मैं इस साइट से एलडीएपी एसडीके का उपयोग कर रहा हूं: https://www.unboundid.com/products/ldap-sdk/। मैं एक खोज ऑपरेशन करना चाहता हूं जो बहुत सी प्रविष्टियां देता है।एलडीएपी: 1000 से अधिक परिणाम कैसे लौटाएं (जावा)

एफएक्यू की साइट के अनुसार, (https://www.unboundid.com/products/ldap-sdk/docs/ldapsdk-faq.php#search) मुझे एक SearchResultListener कार्यान्वयन का उपयोग करना होगा।

तो यहाँ मैं क्या किया है:

public class UpdateThread extends Thread implements SearchResultListener { 
... 
// create request 
final SearchRequest request = new SearchRequest(this, instance.getBaseDN(),SearchScope.SUB, filter); 
// Setting size limit of results. 
request.setSizeLimit(2000); 

... 

// Get every result one by one. 
@Override 
public void searchEntryReturned(SearchResultEntry arg0) { 
    System.out.println("entry "+arg0.getDN()); 

} 

समस्या यह है कि "searchEntryReturned" की 1000 परिणाम अधिकतम रिटर्न है। यहां तक ​​कि अगर मैं आकार सीमा को "2000" पर सेट करता हूं।

उत्तर

8

हालांकि यह लगभग निश्चित रूप से मामला है कि सर्वर 1000 प्रविष्टियों की आकार सीमा लागू कर रहा है, कई हिस्सों में अनुरोध जारी करके संभावित रूप से इसके आसपास होने के संभावित तरीके हैं।

यदि सर्वर सरल पेज किए गए परिणाम नियंत्रण (आरएफसी 2696 में परिभाषित किया गया है और https://docs.ldap.com/ldap-sdk/docs/javadoc/com/unboundid/ldap/sdk/controls/SimplePagedResultsControl.html के अनुसार एलडीएपी एसडीके में समर्थित है) के उपयोग का समर्थन करता है, तो आप इसका उपयोग "पृष्ठों" में परिणामों के माध्यम से निर्दिष्ट करने के लिए कर सकते हैं प्रविष्टियोंकी संख्या।

वैकल्पिक रूप से, आभासी सूची दृश्य (वीएलवी) अनुरोध नियंत्रण (https://www.unboundid.com/products/ldap-sdk/docs/javadoc/index.html?com/unboundid/ldap/sdk/controls/VirtualListViewRequestControl.html) का उपयोग किया जा सकता है, लेकिन शायद मैं केवल अनुशंसा करता हूं कि यदि सर्वर सरल पेज किए गए परिणाम नियंत्रण का समर्थन नहीं करता है क्योंकि वीएलवी अनुरोध नियंत्रण के लिए भी आवश्यक है परिणामों को हल किया जा सकता है, और संभवतः अनुरोध में सेवा करने में सक्षम होने के लिए सर्वर या विशेष रूप से महंगी प्रसंस्करण में विशेष कॉन्फ़िगरेशन की आवश्यकता होती है।

+0

साथ यह (सरल पृष्ठांकित परिणाम नियंत्रण) काम किया! आपका बहुत बहुत धन्यवाद ! – stage

5

एलडीएपी क्लाइंट 2000 की "क्लाइंट-अनुरोधित" आकार सीमा निर्धारित कर रहा है। यह क्लाइंट-अनुरोधित सीमा सर्वर की कॉन्फ़िगरेशन में निर्धारित सीमाओं को ओवरराइड नहीं कर सकती है। इससे कोई फर्क नहीं पड़ता कि ग्राहक द्वारा अनुरोधित आकार सीमा क्या है, सर्वर की आकार सीमा इसे ओवरराइड करती है। अपने निर्देशिका सर्वर व्यवस्थापक से संपर्क करें और पूछें कि आकार सीमा में वृद्धि होनी चाहिए।

8

यह मानक जावा का उपयोग कर एक पृष्ठांकित LDAP क्वेरी को लागू करने, का उपयोग करके बहुत सरल है जोड़ने LdapContext करने के लिए एक PagedResultsControl, ऊपर नील के जवाब के अनुसार एक तीसरी पार्टी एपीआई का उपयोग कर के बिना।

Hashtable<String, Object> env = new Hashtable<String, Object>(11); 
env 
    .put(Context.INITIAL_CONTEXT_FACTORY, 
     "com.sun.jndi.ldap.LdapCtxFactory"); 

/* Specify host and port to use for directory service */ 
env.put(Context.PROVIDER_URL, 
    "ldap://localhost:389/ou=People,o=JNDITutorial"); 

try { 
    LdapContext ctx = new InitialLdapContext(env, null); 

    // Activate paged results 
    int pageSize = 5; 
    byte[] cookie = null; 
    ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, 
     Control.NONCRITICAL) }); 
    int total; 

    do { 
    /* perform the search */ 
    NamingEnumeration results = ctx.search("", "(objectclass=*)", 
     new SearchControls()); 

    /* for each entry print out name + all attrs and values */ 
    while (results != null && results.hasMore()) { 
     SearchResult entry = (SearchResult) results.next(); 
     System.out.println(entry.getName()); 
    } 

    // Examine the paged results control response 
    Control[] controls = ctx.getResponseControls(); 
    if (controls != null) { 
     for (int i = 0; i < controls.length; i++) { 
     if (controls[i] instanceof PagedResultsResponseControl) { 
      PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 
      total = prrc.getResultSize(); 
      if (total != 0) { 
      System.out.println("***************** END-OF-PAGE " 
       + "(total : " + total + ") *****************\n"); 
      } else { 
      System.out.println("***************** END-OF-PAGE " 
       + "(total: unknown) ***************\n"); 
      } 
      cookie = prrc.getCookie(); 
     } 
     } 
    } else { 
     System.out.println("No controls were sent from the server"); 
    } 
    // Re-activate paged results 
    ctx.setRequestControls(new Control[] { new PagedResultsControl(
     pageSize, cookie, Control.CRITICAL) }); 

    } while (cookie != null); 

    ctx.close(); 

उदाहरण here से कॉपी किया गया उदाहरण।

4

मैं @PeterK की तरह हल है, लेकिन कुछ संशोधनों

public List<MyUser> listUsers() { 
    LOG.info("listUsers() inicio"); 
    List<MyUser> users = new ArrayList<MyUser>(); 

    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CTX); 
    env.put(Context.PROVIDER_URL, 'ldap://192.168.10.10:389'); 
    env.put(Context.SECURITY_AUTHENTICATION, CONNECTION_TYPE); 
    env.put(Context.SECURITY_PRINCIPAL, USER_ADMIN_PASSWORD); 
    env.put(Context.SECURITY_CREDENTIALS, USER_ADMIN); 

    try { 
     LdapContext ctx = new InitialLdapContext(env, null); 

     // Activate paged results 
     int pageSize = 1000; 
     byte[] cookie = null; 
     ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, Control.NONCRITICAL) }); 
     int total; 

     do { 
      /* perform the search */ 
      SearchControls sc = new SearchControls(); 
      sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String filtro = "(&(sAMAccountName=*)&(objectClass=user))"; 
      NamingEnumeration results = ctx.search(getBaseDn(ctx), filtro, sc); 

      /* for each entry */ 
      while (results.hasMoreElements()) { 
       SearchResult result = (SearchResult) results.nextElement(); 
       Attributes attributes = result.getAttributes(); 
       //convert to MyUser class 
       MyUser user = toUser(attributes); 
       users.add(user); 
      } 

      // Examine the paged results control response 
      Control[] controls = ctx.getResponseControls(); 
      if (controls != null) { 
       for (int i = 0; i < controls.length; i++) { 
        if (controls[i] instanceof PagedResultsResponseControl) { 
         PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 
         total = prrc.getResultSize(); 
         if (total != 0) { 
          System.out.println("***************** END-OF-PAGE " + "(total : " + total + ") *****************\n"); 
         } else { 
          System.out.println("***************** END-OF-PAGE " + "(total: unknown) ***************\n"); 
         } 
         cookie = prrc.getCookie(); 
        } 
       } 
      } else { 
       System.out.println("No controls were sent from the server"); 
      } 
      // Re-activate paged results 
      ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, cookie, Control.CRITICAL) }); 

     } while (cookie != null); 

     ctx.close(); 

    } catch (NamingException e) { 
     System.err.println("PagedSearch failed."); 
     e.printStackTrace(); 
    } catch (IOException ie) { 
     System.err.println("PagedSearch failed."); 
     ie.printStackTrace(); 
    } catch (Exception ie) { 
     System.err.println("PagedSearch failed."); 
     ie.printStackTrace(); 
    } 

    LOG.info("listUsers() size = " + (users.size())); 
    LOG.info("listUsers() fim"); 

    return users; 
} 


private MyUser toUser(Attributes attributes) throws NamingException { 
    if (attributes != null) { 
     String fullName = attributes.get("distinguishedName") != null ? attributes.get("distinguishedName").get().toString() : null; 
     String mail = attributes.get("mail") != null ? attributes.get("mail").get().toString() : null; 
     String userName = attributes.get("cn") != null ? attributes.get("cn").get().toString() : null; 
     String userPrincipalName = attributes.get("userPrincipalName") != null ? attributes.get("userPrincipalName").get().toString() : null; 

     if (userPrincipalName != null) { 
      String[] user = userPrincipalName.split("@"); 
      if (user != null && user.length > 0) { 
       userName = user[0]; 
      } 
     } 

     MyUser user = new MyUser(); 
     user.setFullName(fullName); 
     user.setEmail(mail); 
     user.setName(userName); 
     user.setUserPrincipalName(userPrincipalName); 
     user.setRoles(getRolesUser(attributes)); 

     return user; 
    } 

    return null; 
} 
+0

पीटरके आपके संदेश को कभी नहीं देख पाएगा जैसा आपने किया था – Drew

+0

यह कैसे करें? ... –

+0

आप अपने उत्तर के तहत एक टिप्पणी दर्ज करेंगे। याद रखें: आपके उत्तर के तहत निम्नलिखित लोगों को सतर्क किया जाता है जब आप अपने उत्तर के तहत कोई टिप्पणी पोस्ट करते हैं ... (1) ओप मुझे लगता है लेकिन मुझे इसे पकड़ न दें, (2) खुद की तरह एक और टिप्पणीकर्ता अगर वह व्यक्ति अकेला है टिप्पणी थ्रेड वाला व्यक्ति किसी और के रूप में टिप्पणी नहीं कर रहा है, (3) कोई भी जिसे आप @theirName जो पहले से ही किसी टिप्पणी में आपके उत्तर में है या ओप – Drew

संबंधित मुद्दे