处理DirContext
本节介绍如何处理 ,包括预处理和后处理。DirContext
自定义前处理和后处理DirContext
在某些情况下,您可能希望对 before 和 after search 操作执行操作。用于此目的的接口称为 。下面的清单显示了该接口:DirContext
DirContextProcessor
DirContextProcessor
public interface DirContextProcessor {
public void preProcess(DirContext ctx) throws NamingException;
public void postProcess(DirContext ctx) throws NamingException;
}
该类有一个采用 , 的 search 方法,如下所示:LdapTemplate
DirContextProcessor
public void search(SearchExecutor se, NameClassPairCallbackHandler handler,
DirContextProcessor processor) throws DataAccessException;
在执行搜索操作之前,将在给定实例上调用该方法。在运行搜索并处理结果后,将调用该方法。这使您可以对 to to be used in the search 执行操作,并检查何时执行了搜索。这可能非常有用(例如,在处理请求和响应控制时)。preProcess
DirContextProcessor
NamingEnumeration
postProcess
DirContext
DirContext
当您不需要自定义时,您还可以使用以下便捷方法:SearchExecutor
public void search(Name base, String filter,
SearchControls controls, NameClassPairCallbackHandler handler, DirContextProcessor processor)
public void search(String base, String filter,
SearchControls controls, NameClassPairCallbackHandler handler, DirContextProcessor processor)
public void search(Name base, String filter,
SearchControls controls, AttributesMapper mapper, DirContextProcessor processor)
public void search(String base, String filter,
SearchControls controls, AttributesMapper mapper, DirContextProcessor processor)
public void search(Name base, String filter,
SearchControls controls, ContextMapper mapper, DirContextProcessor processor)
public void search(String base, String filter,
SearchControls controls, ContextMapper mapper, DirContextProcessor processor)
实现请求控制DirContextProcessor
LDAPv3 协议使用“控件”来发送和接收其他数据,以影响预定义操作的行为。为了简化 request control 的实现,Spring LDAP 提供了基类。此类处理从 的当前请求控件的检索,调用用于创建请求控件的模板方法,并将其添加到 .在子类中,您所要做的就是实现调用的模板方法,以及执行搜索后需要执行的任何操作的方法。以下清单显示了相关的签名:DirContextProcessor
AbstractRequestControlDirContextProcessor
LdapContext
LdapContext
createRequestControl
postProcess
public abstract class AbstractRequestControlDirContextProcessor implements
DirContextProcessor {
public void preProcess(DirContext ctx) throws NamingException {
...
}
public abstract Control createRequestControl();
}
典型类似于以下示例:DirContextProcessor
DirContextProcessor
public class MyCoolRequestControl extends AbstractRequestControlDirContextProcessor {
private static final boolean CRITICAL_CONTROL = true;
private MyCoolCookie cookie;
...
public MyCoolCookie getCookie() {
return cookie;
}
public Control createRequestControl() {
return new SomeCoolControl(cookie.getCookie(), CRITICAL_CONTROL);
}
public void postProcess(DirContext ctx) throws NamingException {
LdapContext ldapContext = (LdapContext) ctx;
Control[] responseControls = ldapContext.getResponseControls();
for (int i = 0; i < responseControls.length; i++) {
if (responseControls[i] instanceof SomeCoolResponseControl) {
SomeCoolResponseControl control = (SomeCoolResponseControl) responseControls[i];
this.cookie = new MyCoolCookie(control.getCookie());
}
}
}
}
确保在使用控件时使用。Control 接口特定于 LDAPv3,并且要求使用 LDAPv3 而不是 .如果使用非 an 的参数调用子类,则会引发 .LdapContextSource LdapContext DirContext AbstractRequestControlDirContextProcessor LdapContext IllegalArgumentException |
分页搜索结果
某些搜索可能会返回大量结果。当没有简单的方法可以过滤掉较小的数量时,让服务器每次调用时只返回一定数量的结果会很方便。这称为 “分页搜索结果”。然后可以显示结果的每个“页面”,并带有指向下一页和上一页的链接。如果没有此功能,客户端必须手动将搜索结果限制到页面中,或者检索整个结果,然后将其切成大小合适的页面。前者相当复杂,而后者会消耗不必要的内存量。
某些 LDAP 服务器支持 ,它请求 LDAP 服务器以指定大小的页面返回搜索操作的结果。用户通过控制调用搜索的速率来控制返回页面的速率。但是,您必须跟踪调用之间的 Cookie。服务器使用此 Cookie 来跟踪上次使用分页结果请求调用它时停止的位置。PagedResultsControl
Spring LDAP 通过使用 pre- processing 和 post-processing 的概念来提供对分页结果的支持,如前面的部分所述。它通过使用 class.该类会创建一个具有请求的页面大小的 .搜索后,它会获取并检索分页结果 Cookie,这是在连续分页结果请求之间保持上下文所必需的。LdapContext
PagedResultsDirContextProcessor
PagedResultsDirContextProcessor
PagedResultsControl
LdapContext
PagedResultsResponseControl
以下示例显示了如何使用分页搜索结果功能:
PagedResultsDirContextProcessor
public List<String> getAllPersonNames() {
final SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
final PagedResultsDirContextProcessor processor =
new PagedResultsDirContextProcessor(PAGE_SIZE);
return SingleContextSource.doWithSingleContext(
contextSource, new LdapOperationsCallback<List<String>>() {
@Override
public List<String> doWithLdapOperations(LdapOperations operations) {
List<String> result = new LinkedList<String>();
do {
List<String> oneResult = operations.search(
"ou=People",
"(&(objectclass=person))",
searchControls,
CN_ATTRIBUTES_MAPPER,
processor);
result.addAll(oneResult);
} while(processor.hasMore());
return result;
}
});
}
要使分页结果 Cookie 继续有效,必须对每个分页结果调用使用相同的基础连接。您可以使用 ,如前面的示例所示。SingleContextSource |