第五章 DirContext配製 spring
5.1 自定義DirContext 先後處理
某些狀況下,在搜索先後要調用DirContext進行操做,進行這種操做的接口爲DirContextProcessor
publicinterfaceDirContextProcessor{
publicvoidpreProcess(DirContextctx)throwsNamingException;
publicvoidpostProcess(DirContextctx)throwsNamingException;
}
LdapTemplate有一個查詢方法提供了DirContextProcessor
publicvoidsearch(SearchExecutorse,NameClassPairCallbackHandlerhandler,
DirContextProcessorprocessor)throwsDataAccessException;
在查詢以前,前處理方法提供了一個DirContextProcessor的實例 ,當查詢完成並處理後,調用後處理方法,這對於用戶在查詢中調用DirContext,查詢完成後檢查
DirContext很是有用。例如在處理請求和響應控制數組
也有一些並不須要自定義SearchExecutor的方法:
publicvoidsearch(Namebase,Stringfilter,
SearchControlscontrols,NameClassPairCallbackHandlerhandler,DirContextProcessorprocessor)
publicvoidsearch(Stringbase,Stringfilter,
SearchControlscontrols,NameClassPairCallbackHandlerhandler,DirContextProcessorprocessor)
publicvoidsearch(Namebase,Stringfilter,
SearchControlscontrols,AttributesMappermapper,DirContextProcessorprocessor)
publicvoidsearch(Stringbase,Stringfilter,
SearchControlscontrols,AttributesMappermapper,DirContextProcessorprocessor)
publicvoidsearch(Namebase,Stringfilter,
SearchControlscontrols,ContextMappermapper,DirContextProcessorprocessor)
publicvoidsearch(Stringbase,Stringfilter,
SearchControlscontrols,ContextMappermapper,DirContextProcessorprocessor)
5.2 實現一個請求控制的DirContextProcessor
LDAPv3標準使用控制器來發送和接收數據來影響一些預約義行爲,爲了簡化一個請求控制DirContextProcessor的實現,spring ldap提供了一基類
AbstractRequestControlDirContextProcessor, 這個方法來處理LdapContext的當前請求,控制方法調用一個模板建立的請求,並添加到Ldapcontext中,你要作的是在類中實現 createRequestControl,和postProcess方法來實現查詢後你要完成的操做。
publicabstractclassAbstractRequestControlDirContextProcessorimplements
DirContextProcessor{
publicvoidpreProcess(DirContextctx)throwsNamingException{
...
}
publicabstractControlcreateRequestControl();
}
一個典型的DirContextProcessor,相似以下代碼:
例5.1 一個請求控制的實現
packagecom.example.control;
publicclassMyCoolRequestControlextendsAbstractRequestControlDirContextProcessor{
privatestaticfinalbooleanCRITICAL_CONTROL=true;
privateMyCoolCookiecookie;
...
publicMyCoolCookiegetCookie(){
returncookie;
}
publicControlcreateRequestControl(){
returnnewSomeCoolControl(cookie.getCookie(),CRITICAL_CONTROL);
}
publicvoidpostProcess(DirContextctx)throwsNamingException{
LdapContextldapContext=(LdapContext)ctx;
Control[]responseControls=ldapContext.getResponseControls();
for(inti=0;i<responseControls.length;i++){
if(responseControls[i]instanceofSomeCoolResponseControl){
SomeCoolResponseControlcontrol=(SomeCoolResponseControl)responseControls[i];
this.cookie=newMyCoolCookie(control.getCookie());
}
}
}
}
注意:
當 前使用Controls時,必定要使用LdapContextSource,這個接口是特定的用來使用LdapContext代替DirContext 的,若是一個AbstractRequestControlDirContextProcessor子類調用的不是一個LdapContext參數,它將 拋出異常IllegalArgumentException
5.3 查詢結果分頁
某些查詢可能返回大量 結果集。當咱們沒有簡便的方法去篩選出較小的數據量時,它將方便的讓服務器返回必定數量結果集,這稱爲分頁搜索。結果的每一頁和上下頁連接將被顯示出來, 若是沒有這個功能,客戶端需手動限制結果頁或檢索整個結果集截取一部分,前者比較麻煩,後者比較消耗內存。
許多Ldap服務器都 支持PagedResultsControl,它發送請求,服務器返回搜索結果特定頁,用戶控制返回頁進度(Rate),簡單稱爲進度搜索,可是用戶必須 保持跟蹤調用中的會話,使服務器知道上一次搜索結果頁及從哪開始搜索。SpringLdap提供了使用LdapContext對搜索結果先後處理的分頁方 法,這在前面有討論。它經過兩個類
PagedResultsRequestControl和 PagedResultsCookie,PagedResultsRequestControl類創建了一個PagedResultsControl來請 求頁面大小,並放入LdapContext中,搜索完成後,從PagedResultsResponseControl中獲得兩部分信息,預計總結果大小 及cookie。cookie是一個字節數組,包含了經過PagedResultsControl下一次調用服務器時所需的信息,爲了更好的存儲這些信 息,ldap提供了包裝類PagedResultsCookie.
下面的例子展現瞭如何分頁搜索。
例5.2 使用PagedResultsRequestControl返回分頁結果
publicPagedResultgetAllPersons(PagedResultsCookiecookie){
PagedResultsRequestControlcontrol=newPagedResultsRequestControl(PAGE_SIZE,cookie);
SearchControlssearchControls=newSearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
Listpersons=ldapTemplate.search("","objectclass=person",searchControls,control);
returnnewPagedResult(persons,control.getCookie());
}
第一次調用此方法,cookie參數將爲NULL,但在隨後的每一次調用時都要提供上次的PagedResult包裝的cookie信息,當 Cookie無效時
(pagedResult.getCookie().getCookie() returns null),即表示最後一批結果已返回。服務器