2016-10-18 13 views
0

У меня возникли проблемы с работой управления VLV. Я использую ApacheDS 2.0.0 и разговариваю с ним, используя Java JNDI с ldapbp-1.0.jar от Sun. При запросе сервер говорит, что поддерживает элемент управления VLV. Я не получаю никаких ошибок, но, я настроил поиск, и я возвращаю все результаты, а не подмножество. Я создал новый экземпляр ApacheDS, и в нем есть 10 пользователей. Я всегда получаю все 10 результатов.Не удается заставить LDAP VirtualListView работать

Я также получаю функцию SortResponseControl и никогда не поддерживаю VirtualListViewResponseControl.

Я видел много примеров, и я по существу делаю то, что они есть. В этом примере кода я принял стенографию и просто изменил информацию о соединении и критерии поиска, и я все равно получаю ту же проблему. Post from LDAP Pro forum

Некоторые из параметров, которые я пробовал для VirtualListViewControl являются:

new VirtualListViewControl(1, 0, 0, 19, Control.CRITICAL); // original - gets all 
    new VirtualListViewControl(1, 10, 1, 2, Control.CRITICAL); // target offset -gets all 
    new VirtualListViewControl(20, 3, Control.CRITICAL); // target percentage - gets all 
    new VirtualListViewControl("Tryit4", 3, Control.CRITICAL); // target value, view size - gets all 
    new VirtualListViewControl("Tryit4", 2, 1, Control.CRITICAL); // target value, before count, after count 

я должен делать что-то неправильно, но я не могу видеть, что это такое. Любая помощь будет оценена по достоинству. Thanks

Извините, что ссылка не работает. Это было для меня. Вот пример кода, который я использую, который всегда возвращает SortResponseControl и все записи LDAP.

/** 
* 
* VLVJndiClient.java 
* Sample code to demostrate how Virtual List View (VLV) Control works. 
* Note: 
*  1) Note: JNDI Boost package is required for this example to run. 
*  2) VLV Control MUST be used in conjunction with Sort Control. 
*  Otherwise, you will be braced by: [LDAP: error code 60 - VLV Control] 
* 3) SunOne Directory Server supports VLV & Microsoft supports VLV since AD2003 
* 
*/ 

import java.util.Hashtable; 
import java.io.*; 

import javax.naming.*; 
import javax.naming.directory.*; 
import javax.naming.ldap.*; 

import com.sun.jndi.ldap.ctl.VirtualListViewControl; 
import com.sun.jndi.ldap.ctl.VirtualListViewResponseControl; 
import com.sun.jndi.ldap.ctl.SortControl; 

public class VLVJndiClientShort 
{ 

    static final String VLV_CONTROL_OID = "2.16.840.1.113730.3.4.9"; 

    public static void main(String[] args) throws IOException 
    { 
     Hashtable env = new Hashtable(); 

     env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory"); 

     env.put(Context.PROVIDER_URL, "ldap://172.16.2.23:10389"); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); 
     env.put(Context.SECURITY_CREDENTIALS, "test"); 

     try { 
      /* Create initial context with no connection request controls */ 
      LdapContext ctx = new InitialLdapContext(env, null); 

      /* Query the server to see if the VLV Control is supported */ 
      if (!isVLVControlSupported(ctx)){ 
       System.out.println(
      "The server does not support Virtual List View (VLV) Control."); 
       System.exit(1); 
      } 

      /* Sort Control is required for VLV to work */ 
      SortControl sctl = new SortControl(
       new String[]{"cn"}, // sort by cn 
       Control.CRITICAL 
      ); 

      /* VLV that returns the first 20 answers 0 to 19 changed 19 to 2 */ 
      VirtualListViewControl vctl = 
//    new VirtualListViewControl(1, 0, 0, 19, Control.CRITICAL); // original - gets all 
//    new VirtualListViewControl(1, 10, 1, 2, Control.CRITICAL); // target offset, list size, before count, after count, criticality - gets all 
//     new VirtualListViewControl(20, 3, Control.CRITICAL); // target percentage, view size, criticality - gets all 
//     new VirtualListViewControl("Tryit4", 3, Control.CRITICAL); // target value, view size, criticality - gets all 
        new VirtualListViewControl("Tryit4", 2, 1, Control.CRITICAL); // target value, before count, after count, criticality 

      /* Set context's request controls */ 
      ctx.setRequestControls(new Control[]{sctl, vctl}); // returns only a sorted control but no VLV control 

      /* Perform search */ 
      NamingEnumeration answer = 
        ctx.search("dc=mir3,dc=example,dc=com", "(objectclass=*)", null); 

      /* Enumerate search results */ 
      while (answer.hasMore()) { 
       SearchResult si = (SearchResult)answer.next(); 
       System.out.println(si.getName()); 
      } 

      /* examine the response controls (if any) */ 
      printControls(ctx.getResponseControls()); 

      ctx.close(); 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
    } 

    static void printControls(Control[] controls) 
    { 
     if(controls == null){ 
      System.out.println("No response controls"); 
      return; 
     } 

     for(int j = 0; j < controls.length; j++) { 
      if(controls[j] instanceof SortResponseControl){ 
       SortResponseControl src = (SortResponseControl)controls[j]; 
       if (src.isSorted()) { 
        System.out.println("Sorted-Search completed successfully"); 
       } else { 
        System.out.println(
         "Sorted-Search did not complete successfully: error (" + 
         src.getResultCode() + ") on attribute '" + 
         src.getAttributeID() + "'"); 
       } 
      }else if(controls[j] instanceof VirtualListViewResponseControl){ 
       VirtualListViewResponseControl vlv = 
         (VirtualListViewResponseControl)controls[j]; 
       if (vlv.getResultCode() == 0) { 
        System.out.println("Sorted-View completed successfully"); 
        System.out.println("TargetOffset: " + vlv.getTargetOffset()); 
        System.out.println("ListSize: " + vlv.getListSize()); 
       } else { 
        System.out.println("Sorted-View did not complete successfully: " 
           + vlv.getResultCode()); 
       } 
      } else { 
       System.out.println("Received control: "+ controls[j].getID()); 
      } 
     } 
    } 

    /** 
    * Is VLV Control supported? 
    * 
    * Query the rootDSE object to find out if VLV Control 
    * is supported. 
    */ 
    static boolean isVLVControlSupported(LdapContext ctx) 
    throws NamingException 
    { 
     SearchControls ctl = new SearchControls(); 
     ctl.setReturningAttributes(new String[]{"supportedControl"}); 
     ctl.setSearchScope(SearchControls.OBJECT_SCOPE); 

     /* search for the rootDSE object */ 
     NamingEnumeration results = ctx.search("", "(objectClass=*)", ctl); 

     while(results.hasMore()){ 
      SearchResult entry = (SearchResult)results.next(); 
      NamingEnumeration attrs = entry.getAttributes().getAll(); 
      while (attrs.hasMore()){ 
       Attribute attr = (Attribute)attrs.next(); 
       NamingEnumeration vals = attr.getAll(); 
       while (vals.hasMore()){ 
        String value = (String) vals.next(); 
        if (value.equals(VLV_CONTROL_OID)) 
         return true; 
       } 
      } 
     } 
     return false; 
    } 

} 
+0

Ссылка не работает, и в любом случае код должен быть размещен здесь. – EJP

+0

Извините. Просто добавил код. – eightmd

ответ

-1

Никто, кажется, не имеет никакого отношения к этому, но я скажу вам, что я нашел. Как было сказано выше, я попытался заставить VLV работать на OpenLDAP и apacheDS. При запросе серверов говорят, что они поддерживают элемент управления, но когда вы его используете, вы возвращаете все записи, а не подмножество, которое было запрошено.

Поскольку мой клиент использовал сервер SunOne LDAP, я решил, что попробую это. SunOne был только около двух лет в начале 2000-х годов, но он поддерживался как Служба каталогов Oracle до 2011 года. Вы можете скачать его со своего сайта по адресу Oracle site for download. Найдите Oracle Directory Server Enterprise Edition (11.1.1.7.0). Я считаю, что вам нужен логин Oracle Developers. Инструкции по установке приведены здесь Installation Documentation.

Служба каталогов Oracle является единственным сервером LDAP, который я нашел в моем ограниченном поиске, который правильно поддерживает элемент управления VLV, поскольку он документирован.

УКАЗЫВАЙТЕ, что серверы скажут, что они поддерживают VLV, но когда они поддерживают поиск в режиме Paged, VLV не будет реализован правильно.

Это то, что я нашел, и если я ошибаюсь, мне бы хотелось услышать, как другие LDAP-серверы поддерживают VLV для подкачки. Для тех, кто смотрел этот пост Спасибо!

+0

VLV работает правильно для OpenLDAP для меня. Я не знаю, что вы подразумеваете под «, когда они поддерживают также поиск по страницам». Наложение 'sssvlv' заменяет оверлей выложенных результатов в OpenLDAP. – EJP

+0

Ну, версия OpenLDAP, которую я использую при запросе, говорит, что она поддерживает VLV, но когда я даю ей элемент управления VLV, он возвращает все записи, а не только те записи, которые я просил. Я не знаю о наложении sssvlv. Я ничего не установил, но OpenLDAP также сказал, что поддерживает результаты paged-results, и он работает правильно. – eightmd