SpringLDAP-Reference (中文文檔五)

第五章 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),即表示最後一批結果已返回。服務器

相關文章
相關標籤/搜索