LDAP: How to return more than 1000 results (java)

前端 未结 4 1416
情书的邮戳
情书的邮戳 2020-12-14 09:33

I am using the LDAP SDK from this site: https://www.unboundid.com/products/ldap-sdk/ . I would like to make a search operation which returns a lot of entries.

Accord

4条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-14 10:02

    It is pretty simple to implement a paged LDAP query using standard java, by using the adding a PagedResultsControl to the LdapContext, without using a third party API as per Neil's answer above.

    Hashtable env = new Hashtable(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();
    

    Example copied from here.

提交回复
热议问题