<p>
</p>
<p>package test2;</p>
<p>import java.io.BufferedReader;</p>
<p>import java.io.InputStreamReader;</p>
<p>import java.util.Enumeration;</p>
<p>import java.util.Properties;</p>
<p>import javax.naming.NamingEnumeration;</p>
<p>import javax.naming.NamingException;</p>
<p>import javax.naming.directory.Attribute;</p>
<p>import javax.naming.directory.Attributes;</p>
<p>import javax.naming.directory.BasicAttribute;</p>
<p>import javax.naming.directory.BasicAttributes;</p>
<p>import javax.naming.directory.DirContext;</p>
<p>import javax.naming.directory.InitialDirContext;</p>
<p>import javax.naming.directory.ModificationItem;</p>
<p>import javax.naming.directory.SearchControls;</p>
<p>import javax.naming.directory.SearchResult;</p>
<p></p>
<p>public class Test {</p>
<p><span> </span>public static DirContext dc; //相当于这个树的一个映像</p>
<p><span> </span>public static void conn()</p>
<p><span> </span>{</p>
<p><span> </span>String dn="cn=Manager,dc=my-domain,dc=com"; //包括连接LDAP服务器的用户及要操作的根节点</p>
<p><span> </span>Properties env = new Properties();</p>
<p><span> </span>env.put(DirContext.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");</p>
<p><span> </span>env.put(DirContext.PROVIDER_URL, "ldap://localhost:" + 389);</p>
<p><span> </span>if (dn != null) {</p>
<p><span> </span> env.put(DirContext.SECURITY_PRINCIPAL, dn);</p>
<p><span> </span> env.put(DirContext.SECURITY_CREDENTIALS, "secret");</p>
<p><span> </span>}</p>
<p><span> </span>try {</p>
<p><span> </span>dc = new InitialDirContext(env);</p>
<p><span> </span>System.out.println("连接成功");</p>
<p><span> </span>} catch (NamingException e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span></p>
<p><span> </span>public static void deleteInformation()</p>
<p> {</p>
<p> try {</p>
<p> dc.destroySubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com");</p>
<p> System.out.println("删除成功");</p>
<p> } catch (NamingException ne) {</p>
<p> <span> </span> ne.printStackTrace();</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void addInformation()</p>
<p> {</p>
<p> try</p>
<p> {</p>
<p> Attributes attrs = new BasicAttributes();</p>
<p> attrs.put("uid", "alee");</p>
<p> <span> </span>attrs.put("sn","Lee");</p>
<p> <span> </span>attrs.put("telephoneNumber", "14085550017");</p>
<p> <span> </span>attrs.put("userPassword","redqueen".getBytes());</p>
<p> <span> </span>BasicAttribute objectclass = new BasicAttribute("objectclass");</p>
<p> <span> </span>objectclass.add("uidObject");</p>
<p> <span> </span>objectclass.add("person");</p>
<p> <span> </span>attrs.put(objectclass);</p>
<p> dc.createSubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com", attrs);</p>
<p> System.out.println("添加成功");</p>
<p></p>
<p> } catch (Exception ne) {</p>
<p> ne.printStackTrace();</p>
<p> System.out.println("添加失败");</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void modifyInformation(String dn)</p>
<p> {</p>
<p> try {</p>
<p> ModificationItem[] mods = new ModificationItem[1];</p>
<p> mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", "qm"));// 所修改的属性</p>
<p> dc.modifyAttributes(dn,mods);</p>
<p> System.out.println("修改成功");</p>
<p> } catch (NamingException ne) {</p>
<p> <span> </span> <span> </span>ne.printStackTrace();</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void search() {// 我只能按照某些属性查找节点,偶还不会怎么查找一个目录或按照更复杂的正则式查找特定节点/目录</p>
<p><span> </span>try {</p>
<p><span> </span>SearchControls constraints = new SearchControls();</p>
<p><span> </span>constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);</p>
<p><span> </span>System.out.print("what would you want to search:");</p>
<p><span> </span>BufferedReader bd = new BufferedReader(new InputStreamReader(System.in));</p>
<p><span> </span>String s = bd.readLine();</p>
<p><span> </span>NamingEnumeration en = dc.search("dc=my-domain,dc=com", "uid=" + s, constraints); // 要查询的UID。如果是*则可以查到所有UID的节点</p>
<p><span> </span>if (en == null) {</p>
<p><span> </span>System.out.println("Have no NamingEnumeration.");</p>
<p><span> </span>}</p>
<p><span> </span>if (!en.hasMoreElements()) {</p>
<p><span> </span>System.out.println("Have no element.");</p>
<p><span> </span>}</p>
<p><span> </span>while (en != null && en.hasMoreElements()) {// 可以查出多个元素</p>
<p><span> </span>Object obj = en.nextElement();</p>
<p><span> </span>if (obj instanceof SearchResult) {</p>
<p><span> </span>SearchResult si = (SearchResult) obj;</p>
<p><span> </span>System.out.println("/tname: " + si.getName());</p>
<p><span> </span>Attributes attrs = si.getAttributes();</p>
<p><span> </span>if (attrs == null) {</p>
<p><span> </span>System.out.println("/tNo attributes");</p>
<p><span> </span>} else {</p>
<p><span> </span>for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();) {// 获得该节点的所有属性</p>
<p><span> </span>Attribute attr = (Attribute) ae.next();// 下一属性</p>
<p><span> </span>String attrId = attr.getID();// 获得该属性的属性名</p>
<p><span> </span>for (Enumeration vals = attr.getAll(); vals.hasMoreElements();) {// 获得一个属性中的所有属性值</p>
<p><span> </span>System.out.print("/t/t" + attrId + ": ");</p>
<p><span> </span>Object o = vals.nextElement();// 下一属性值</p>
<p><span> </span>if (o instanceof byte[])</p>
<p><span> </span>System.out.println(new String((byte[]) o));</p>
<p><span> </span>else</p>
<p><span> </span>System.out.println(o);</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>} else {</p>
<p><span> </span>System.out.println(obj);</p>
<p><span> </span>}</p>
<p><span> </span>System.out.println();</p>
<p><span> </span>}</p>
<p><span> </span>} catch (Exception e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span></p>
<p><span> </span>public static void main(String[] args) {</p>
<p><span> </span>conn();</p>
<p><span> </span>addInformation();</p>
<p><span> </span>deleteInformation();</p>
<p><span> </span>modifyInformation("uid=jdoe,ou=people,dc=my-domain,dc=com");</p>
<p><span> </span>search();</p>
<p><span> </span>try {</p>
<p><span> </span>dc.close();</p>
<p><span> </span>} catch (NamingException e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p>}</p>
</p>
<p>package test2;</p>
<p>import java.io.BufferedReader;</p>
<p>import java.io.InputStreamReader;</p>
<p>import java.util.Enumeration;</p>
<p>import java.util.Properties;</p>
<p>import javax.naming.NamingEnumeration;</p>
<p>import javax.naming.NamingException;</p>
<p>import javax.naming.directory.Attribute;</p>
<p>import javax.naming.directory.Attributes;</p>
<p>import javax.naming.directory.BasicAttribute;</p>
<p>import javax.naming.directory.BasicAttributes;</p>
<p>import javax.naming.directory.DirContext;</p>
<p>import javax.naming.directory.InitialDirContext;</p>
<p>import javax.naming.directory.ModificationItem;</p>
<p>import javax.naming.directory.SearchControls;</p>
<p>import javax.naming.directory.SearchResult;</p>
<p></p>
<p>public class Test {</p>
<p><span> </span>public static DirContext dc; //相当于这个树的一个映像</p>
<p><span> </span>public static void conn()</p>
<p><span> </span>{</p>
<p><span> </span>String dn="cn=Manager,dc=my-domain,dc=com"; //包括连接LDAP服务器的用户及要操作的根节点</p>
<p><span> </span>Properties env = new Properties();</p>
<p><span> </span>env.put(DirContext.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");</p>
<p><span> </span>env.put(DirContext.PROVIDER_URL, "ldap://localhost:" + 389);</p>
<p><span> </span>if (dn != null) {</p>
<p><span> </span> env.put(DirContext.SECURITY_PRINCIPAL, dn);</p>
<p><span> </span> env.put(DirContext.SECURITY_CREDENTIALS, "secret");</p>
<p><span> </span>}</p>
<p><span> </span>try {</p>
<p><span> </span>dc = new InitialDirContext(env);</p>
<p><span> </span>System.out.println("连接成功");</p>
<p><span> </span>} catch (NamingException e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span></p>
<p><span> </span>public static void deleteInformation()</p>
<p> {</p>
<p> try {</p>
<p> dc.destroySubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com");</p>
<p> System.out.println("删除成功");</p>
<p> } catch (NamingException ne) {</p>
<p> <span> </span> ne.printStackTrace();</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void addInformation()</p>
<p> {</p>
<p> try</p>
<p> {</p>
<p> Attributes attrs = new BasicAttributes();</p>
<p> attrs.put("uid", "alee");</p>
<p> <span> </span>attrs.put("sn","Lee");</p>
<p> <span> </span>attrs.put("telephoneNumber", "14085550017");</p>
<p> <span> </span>attrs.put("userPassword","redqueen".getBytes());</p>
<p> <span> </span>BasicAttribute objectclass = new BasicAttribute("objectclass");</p>
<p> <span> </span>objectclass.add("uidObject");</p>
<p> <span> </span>objectclass.add("person");</p>
<p> <span> </span>attrs.put(objectclass);</p>
<p> dc.createSubcontext("cn=mm,ou=ppeople,dc=my-domain,dc=com", attrs);</p>
<p> System.out.println("添加成功");</p>
<p></p>
<p> } catch (Exception ne) {</p>
<p> ne.printStackTrace();</p>
<p> System.out.println("添加失败");</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void modifyInformation(String dn)</p>
<p> {</p>
<p> try {</p>
<p> ModificationItem[] mods = new ModificationItem[1];</p>
<p> mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("sn", "qm"));// 所修改的属性</p>
<p> dc.modifyAttributes(dn,mods);</p>
<p> System.out.println("修改成功");</p>
<p> } catch (NamingException ne) {</p>
<p> <span> </span> <span> </span>ne.printStackTrace();</p>
<p> }</p>
<p> }</p>
<p><span> </span></p>
<p><span> </span>public static void search() {// 我只能按照某些属性查找节点,偶还不会怎么查找一个目录或按照更复杂的正则式查找特定节点/目录</p>
<p><span> </span>try {</p>
<p><span> </span>SearchControls constraints = new SearchControls();</p>
<p><span> </span>constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);</p>
<p><span> </span>System.out.print("what would you want to search:");</p>
<p><span> </span>BufferedReader bd = new BufferedReader(new InputStreamReader(System.in));</p>
<p><span> </span>String s = bd.readLine();</p>
<p><span> </span>NamingEnumeration en = dc.search("dc=my-domain,dc=com", "uid=" + s, constraints); // 要查询的UID。如果是*则可以查到所有UID的节点</p>
<p><span> </span>if (en == null) {</p>
<p><span> </span>System.out.println("Have no NamingEnumeration.");</p>
<p><span> </span>}</p>
<p><span> </span>if (!en.hasMoreElements()) {</p>
<p><span> </span>System.out.println("Have no element.");</p>
<p><span> </span>}</p>
<p><span> </span>while (en != null && en.hasMoreElements()) {// 可以查出多个元素</p>
<p><span> </span>Object obj = en.nextElement();</p>
<p><span> </span>if (obj instanceof SearchResult) {</p>
<p><span> </span>SearchResult si = (SearchResult) obj;</p>
<p><span> </span>System.out.println("/tname: " + si.getName());</p>
<p><span> </span>Attributes attrs = si.getAttributes();</p>
<p><span> </span>if (attrs == null) {</p>
<p><span> </span>System.out.println("/tNo attributes");</p>
<p><span> </span>} else {</p>
<p><span> </span>for (NamingEnumeration ae = attrs.getAll(); ae.hasMoreElements();) {// 获得该节点的所有属性</p>
<p><span> </span>Attribute attr = (Attribute) ae.next();// 下一属性</p>
<p><span> </span>String attrId = attr.getID();// 获得该属性的属性名</p>
<p><span> </span>for (Enumeration vals = attr.getAll(); vals.hasMoreElements();) {// 获得一个属性中的所有属性值</p>
<p><span> </span>System.out.print("/t/t" + attrId + ": ");</p>
<p><span> </span>Object o = vals.nextElement();// 下一属性值</p>
<p><span> </span>if (o instanceof byte[])</p>
<p><span> </span>System.out.println(new String((byte[]) o));</p>
<p><span> </span>else</p>
<p><span> </span>System.out.println(o);</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span>} else {</p>
<p><span> </span>System.out.println(obj);</p>
<p><span> </span>}</p>
<p><span> </span>System.out.println();</p>
<p><span> </span>}</p>
<p><span> </span>} catch (Exception e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p><span> </span></p>
<p><span> </span>public static void main(String[] args) {</p>
<p><span> </span>conn();</p>
<p><span> </span>addInformation();</p>
<p><span> </span>deleteInformation();</p>
<p><span> </span>modifyInformation("uid=jdoe,ou=people,dc=my-domain,dc=com");</p>
<p><span> </span>search();</p>
<p><span> </span>try {</p>
<p><span> </span>dc.close();</p>
<p><span> </span>} catch (NamingException e) {</p>
<p><span> </span>e.printStackTrace();</p>
<p><span> </span>}</p>
<p><span> </span>}</p>
<p>}</p>