LDAP服务器端可以支持分页查询,但是有个前提条件,需要客户端先发送按关键字排序的指令后,才能执行分页查询。排序的过程是比较耗费时间的,需要对服务器做很多优化的操作。
我的方法是在迭代结果集的时候实现分页,见代码:
package ldap.page;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
/**
* LDAP分页查询,使用时需要异步统计返回结果集的总行数
* @author sxl
*
*/
public class LdapSearch {
/**
* 根据条件查找指定DN的条目下的一层所有属性
*
* @param dn
* 要查询的BaseDN名称
* @param filter
* 要查询的过滤字符串
* @param returnedAtts
* 要查找的属性
* @param start
* 开始行
* @param limit
* 分页大小,如果为-1,则返回结果集的总行数
* @return 符合查询结果的List
*/
public static List searchContextOneByPage(String dn, String filter, String[] returnedAtts, int start, int limit){
DirContext context = getDirContext("url","username","password");
if(context == null) return null;
// 实例化一个搜索器
SearchControls constraints = new SearchContr