LDAP.search()当查询的数据较多时,数据条目大于LDAP服务器设置的最多数据时,就会出现SizeLimitExceededException。
解决方法之一是分页查询,控制每次查询的数目。
public void getAllPerson() throws NamingException, IOException {
SearchControls schCtrls = new SearchControls();
// 返回属性
String[] returnAttrs = { "userPrincipalName", "distinguishedName" };
schCtrls.setReturningAttributes(returnAttrs);
schCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
int pageSize = 100;
byte[] cookie = null;
ContextSource contextSource = ldapTemplate.getContextSource();
DirContext ctx = contextSource.getReadWriteContext();
LdapContext lCtx = (LdapContext) ctx;
lCtx.setRequestControls(new Control[] { new PagedResultsControl(
pageSize, Control.CRITICAL) });
int totalResults = 0;
do {
AndFilter andF = new AndFilter();
andF.and(new EqualsFilter("objectclass", "person")).and(
new LikeFilter("userPrincipalName", "*"));
NamingEnumeration<SearchResult> results = lCtx.search("",
andF.toString(), schCtrls);
while (results != null && results.hasMoreElements()) {
SearchResult sr = results.next();
Attributes attrs = sr.getAttributes();
System.out.println(attrs.get("userPrincipalName").get());
System.out.println(attrs.get("distinguishedName").get());
totalResults++;
}
cookie = parseControls(lCtx.getResponseControls());
lCtx.setRequestControls(new Control[] { new PagedResultsControl(
pageSize, cookie, Control.CRITICAL) });
} while ((cookie != null) && (cookie.length != 0));
lCtx.close();
System.out.println("Total" + totalResults);
}
private static byte[] parseControls(Control[] controls)
throws NamingException {
byte[] cookie = null;
if (controls != null) {
for (int i = 0; i < controls.length; i++) {
if (controls[i] instanceof PagedResultsResponseControl) {
PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i];
cookie = prrc.getCookie();
System.out.println(">>Next Page \n");
}
}
}
return (cookie == null) ? new byte[0] : cookie;
}
其中的cookie是告诉服务器目前已获得的条数,便于下页获取。