轻载目录协议(lightwight Directory Access Protocol)
其类似于做了查询优化的数据库。国外的信息服务站点大都用到了ldap

解决方案 »

  1.   

    novell公司为这个专门做了类库封装,你可以去看一下。
    IBM公司也有
      

  2.   

    建议上http://www.google.com查一查,有很详细的资料
      

  3.   

    以下是论坛上以前的帖子,一个应用例程:
    import java.util.*;
    import javax.naming.*;
    import javax.naming.directory.*;
    import java.io.*;
    import java.beans.*;
     
    public class ConnLDAP{
    public ConnLDAP(){
    super();
    }

    private String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
    private String HOST = "rhserver";
    private String VERSION = "3";
    private String SEARCHBASE = "o=example.com";
    private String PORT = "389";
    private static String MGR_DN = "cn=Manager,dc=example,dc=com";
    private static String MGR_PW = "secret";
    private static String MY_ENTRY;
    private static final int SUB = SearchControls.SUBTREE_SCOPE;
    private DirContext ctx;
      String dn;
    String filter;
    String[] attribs;
    Hashtable atts;
     
    public String getHOST(){
    return HOST;
    }
    public String getSEARCHBASE(){
    return SEARCHBASE;
    } public String getVERSION(){
    return VERSION;
    }
    public String getPORT(){
    return PORT;
    } public boolean connect(String VERSION,
     String HOST,
     String PORT){  
    this.HOST = HOST;
    this.SEARCHBASE = SEARCHBASE;
    this.VERSION = VERSION;
    this.PORT = PORT;   Hashtable env = new Hashtable();
      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
      env.put(Context.PROVIDER_URL,"ldap://rhserver:389");
      //管理员控制
      env.put(Context.SECURITY_AUTHENTICATION,"simple");
      env.put(Context.SECURITY_PRINCIPAL,MGR_DN);
      env.put(Context.SECURITY_CREDENTIALS,MGR_PW);
      try{
         ctx = new InitialDirContext(env);
         System.out.println("ok!");
      }catch(NamingException e){
      System.out.println(e);
      env.clear();
      return false;
    }
      return true;
      
    }

    public boolean search(String dn,
                          String filter,
                          String[] attribs) throws NamingException{

    /*
    Hashtable env = new Hashtable();

    try {
      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
      env.put(Context.PROVIDER_URL,"ldap://rhserver:389");

        DirContext ctx = new InitialDirContext(env);
        Attributes match = new BasicAttributes();
        //for (int i = 1; i <args.length; i+= 2) {
        //match.put(args[i], args[i+1]);
       
        //}
         ctx.search("dc=example,dc=com", match);
        //printSearchList(args[0], ctx.search(args[0], match));
    } catch (Exception e) {
        e.printStackTrace();
    }
    */    //定义查询条件
    this.dn = dn;
    this.filter = filter;
    this.attribs = attribs; try {
    //连接LDAP服务器
    connect(VERSION,HOST,PORT);  
        //重定义属性数组,供获取属性值时用
      String [] attrs = new String [ attribs.length+1 ];
      attrs[0] = "objectclass";
      System.arraycopy(attribs, 0, attrs, 1, attribs.length);
          //查询条目集合
      NamingEnumeration results = ctx.search(dn,filter,new SearchControls());
      
          //*************对每个条目获取其属性值***********
       while(results != null && results.hasMoreElements()){
       Vector vl = new Vector(attribs.length+1);
       //取每一个条目并获取条目名称
       SearchResult si = (SearchResult)results.next();
       String name = si.getName().trim();
       //System.out.println(name);
       if (name.length() == 0)
       vl.addElement(dn);
       else
       vl.addElement(name+","+dn);
        //取出每个条目的每一个属性值
       for (int i=0;i<=attribs.length;i++){
    Attribute a = si.getAttributes().get(attrs[i]);
    if (a == null) {
      vl.addElement("N/A");

    else {
    //数据类型的转化
      Object v = a.get();
      if (v instanceof byte[]) {
        vl.addElement( Common.format( (byte[])v ) );
      }
      else
        System.out.println(attrs[i] + ": " + a.get().toString());
        vl.addElement(a.get().toString() );
    }
       }
        }
    return true;
          //******************************************************
    }
    catch(NamingException e){
    System.out.println(e);
    return false;
    }
    }


    //在增加条目中调用
      public BasicAttributes convertHashtable(Hashtable tmp) {
    Attributes atts = new BasicAttributes();
    Enumeration e = tmp.keys();
    while(e.hasMoreElements()) {
      String keya = (String)e.nextElement();
      //System.out.println(tmp.get(keya));  
      Object[] values =(Object[])tmp.get(keya);
      BasicAttribute at = convertValues(keya, values);
      atts.put (at);
    }

    return (BasicAttributes)atts;
      }  
      
      private BasicAttribute convertValues(String name, Object [] values) {
    BasicAttribute att = new BasicAttribute(name);
    for (int i=0;i<values.length;i++) {
      att.add( values[i] );
    }

    return att;
      }  
      //增加条目
    public boolean addObject(String dn, Hashtable atts) throws NamingException{ this.atts = atts;
    this.dn = dn;
    Attributes ats = convertHashtable(atts);
    /*从Attributes中取出属性名称和属性值,可以看出Attributes的格式是正确的!
    for(NamingEnumeration ee = ats.getAll();ee!=null&&ee.hasMoreElements();){
    Attribute eeats = (Attribute)ee.next();
    System.out.println("attribute:"+eeats.getID());
    for(NamingEnumeration ss=eeats.getAll();ss.hasMoreElements();System.out.println("values:"+ss.nextElement()));
    }*/
    //System.out.println(HOST);
    //连接服务器
          connect(VERSION,HOST,PORT);
      ctx.createSubcontext(dn,ats);
    return true;
    }
      //增加属性
    public boolean addAttrib (String dn, String attr, Object [] values) {
    try {
      modifyObject(dn, DirContext.ADD_ATTRIBUTE, attr, values);
    } catch( NamingException e ) {      
      return false;
    } return true;
      }  

    //修改条目
    public boolean updateObject (String dn, Hashtable atts) {
    try {
      Attributes at = convertHashtable(atts);
      connect(VERSION,HOST,PORT);
      ctx.modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, at);
    } catch (NamingException e) {
      return false;
    } return true;
      }  
      //修改属性
      public boolean updateAttrib (String dn, String attr, Object [] values) {
    try {
      modifyObject(dn, DirContext.REPLACE_ATTRIBUTE, attr, values);
    } catch( NamingException e ) {      
      return false;
    }
    return true;
      }  
      //删除条目
    public boolean delete(String MY_ENTRY){
        try{
    this.MY_ENTRY = MY_ENTRY;
         connect(VERSION,HOST,PORT);
         ctx.destroySubcontext(MY_ENTRY);
        }catch(NamingException e){
        return false;
        }
        return true;
    }
      //删除属性
      public boolean deleteAttrib (String dn, String attr, Object [] values) {
    try {
      modifyObject(dn, DirContext.REMOVE_ATTRIBUTE, attr, values);
    } catch( NamingException e ) {      
      return false;
    } return true;
      }  
    //断开连接
      public boolean disconnect() {
    try {
      if (ctx != null) ctx.close();
    } catch (NamingException e) {
      return false;
    }

    ctx = null;
    return true;
      } 
      ////////////////////////////////////////////////////////////////
      private void modifyObject(String dn, int mod_type, String attr, 
           Object [] values) 
       throws NamingException {
     ModificationItem[] mods = new ModificationItem[1];
     BasicAttribute mod1;
     if (values == null) 
       mod1 = new BasicAttribute(attr);
     else 
       mod1 = convertValues(attr, values);  
     mods[0] = new ModificationItem(mod_type, mod1);
     
     ctx.modifyAttributes(dn, mods);
      }  
      
      /*public void Error(String msg,Exception e){
       String detail;
       if (e == null)
       detail = null;
       else
         detail = e.getMessage();
       listeners.firePropertyChange("error",msg,detail);
       if (debugMode && e !=null){
       System.err.println(e);
       }
      }*/
    }