具有服务器大小限制的LDAP分页

时间:2019-11-05 10:55:09

标签: java spring ldap spring-ldap

我想用Spring-Ldap(2.3.2.RELEASE)实现ldap分页。我的LDAP服务器的大小限制为500。 如果我在一个查询中获取所有结果(没有分页),则会得到500个条目(而不是更多原因)。 如果我尝试获取页面大小为100的所有结果,则会出现无限循环。这是执行分页的方法:

private static final ContextMapper<String> ctxMapper = ctx -> ((DirContextAdapter) ctx).getNameInNamespace();

// ...

public Set<String> listGroups(int pageSize) {

    final SearchControls searchControls = new SearchControls();
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    PagedResultsDirContextProcessor processor = new PagedResultsDirContextProcessor(pageSize);

    // In order for a paged results cookie to continue being valid, it is necessary that the same underlying
    // connection is used for each paged results call. This can be accomplished using the SingleContextSource.
    return SingleContextSource.doWithSingleContext(contextSource,
            (LdapOperations operations) -> {
                Set<String> results = new LinkedHashSet<>();
                do {
                    final List<String> foundGroupNames = operations.search(
                            "",
                            "(objectClass=groupOfUniqueNames)",
                            searchControls,
                            ctxMapper,
                            processor);
                    logger.info("Import found {} external groups.", foundGroupNames.size());
                    results.addAll(foundGroupNames);
                } while (processor.hasMore());

                logger.info("Import found {} external groups.", results.size());
                return results;
            });
}

processor.hasMore()总是返回true,但我不明白为什么。 ContextSource是一个org.springframework.ldap.core.support.LdapContextSource

如果我在LDAP服务器上禁用了大小限制,则该代码有效,以便服务器返回所有结果。所以我认为有些东西我错过了,但是我不知道是什么。

1 个答案:

答案 0 :(得分:0)

我猜您有一个无限循环,因为processor.hasMore()每次都会返回第一组op 1000。

另请参见Paginate on LDAP server which does not support PagedResultsControl