操纵 LdapName(专有名称)
LDAP 以其字符串 表示形式使用专有名称(DN)。用于表示 DN 的字符串 格式在RFC 2253中指定。 DN 由称为相对专有名称(RDN)的组件组成。以下是 DN 的示例:
“ CN = John Smith,O = Isode Limited,C = GB”
它由以下 RDN 组成:
-
CN=John Smith
-
O=Isode Limited
-
C=GB
下面的类分别表示 DN 和 RDN。
LdapName 类实现的javax.naming.Nameinterface类似于javax.naming.CompoundName和javax.naming.CompositeName类。
LdapName 和 Rdn 类允许轻松操作 DN 和 RDN。使用这些 API,可以通过将名称和值配对来构造 RDN。可以使用 RDN 列表构造 DN。类似地,可以从其字符串 表示中检索 DN 和 RDN 的各个组成部分。
LdapName
可以使用RFC 2253中定义的字符串 表示形式或 Rdns 列表创建 LdapName。使用前一种方法时,将根据 RFC2253 中定义的规则来解析指定的字符串。如果字符串 不是有效的 DN,则抛出InvalidNameException。这是一个使用构造函数来解析 LDAP 名称并打印其组件的示例。
String name = "cn=Mango,ou=Fruits,o=Food";
try {
LdapName dn = new LdapName(name);
System.out.println(dn + " has " + dn.size() + " RDNs: ");
for (int i = 0; i < dn.size(); i++) {
System.out.println(dn.get(i));
}
} catch (InvalidNameException e) {
System.out.println("Cannot parse name: " + name);
}
使用"cn=Mango,ou=Fruits,o=Food"
Importing 运行此示例将产生以下结果:
cn=Mango,ou=Fruits,o=Food has 3 RDNs:
o=Food
ou=Fruits
cn=Mango
LdapName 类包含一些方法,这些方法可以以 RDN 和字符串 的形式访问其组件,修改 LdapName,比较两个 LdapName 是否相等以及获取名称的字符串 表示形式。
访问 LDAP 名称的名称组成部分:
您可以使用以下方法来以 RDN 和字符串 的形式访问名称组件:
getRdn(int posn)
get(int posn)
getRdns()
getAll()
getPrefix(int posn)
getSuffix(int posn)
clone()
要检索 LdapName 中特定位置的组件,请使用 getRdn()或 get()。前面的构造函数示例显示了其用法示例。 getRdns()返回所有 RDN 的列表,而getAll()返回 LdapName 的所有组件作为枚举。
最右边的 RDN 在索引 0,最左边的 RDN 在索引 n-1.例如,专有名称"cn=Mango, ou=Fruits, o=Food"
的编号 Sequences 为 0 到 2:\{o=Food, ou=Fruits, cn=Mango\}
您还可以获取 LdapNames 的后缀或前缀作为 LdapName 实例。这是一个example,它获取 LDAP 名称的后缀和前缀。
LdapName dn = new LdapName("cn=Mango, ou=Fruits, o=Food");
Name suffix = dn.getSuffix(1); // 1 <= index < cn.size()
Name prefix = dn.getPrefix(1); // 0 <= index < 1
运行此程序时,它将生成以下输出:
cn=Mango ou=Fruits
o=Food
要复制 LdapName,请使用 clone()。
修改 LDAP 名称
以下是可用于修改 LDAP 名称的方法:
add(Rdn rdn)
add(String comp)
add(int posn,字符串 补偿)
addAll(List suffixRdns)
addAll(Name suffix)
addAll(int posn,List suffixRdns)
addAll(int posn,名称后缀)
remove(int posn)
创建 LdapName 实例后,可以在其中添加和删除组件。这是一个example,它将 LdapName 附加到现有的 LdapName 上,在前面和后面添加组件,并删除第二个组件。
LdapName dn = new LdapName("ou=Fruits,o=Food");
LdapName dn2 = new LdapName("ou=Summer");
System.out.println(dn.addAll(dn2)); // ou=Summer,ou=Fruits,o=Food
System.out.println(dn.add(0, "o=Resources"));
// ou=Summer,ou=Fruits,o=Food,o=Resources
System.out.println(dn.add("cn=WaterMelon"));
// cn=WaterMelon,ou=Summer,ou=Fruits,o=Food,o=Resources
System.out.println(dn.remove(1)); // o=Food
System.out.println(dn);
// cn=WaterMelon,ou=Summer,ou=Fruits,o=Resources
比较 LDAP 名称
以下是可用于比较两个 LDAP 名称的方法:
compareTo(Object name)
equals(Object name)
endsWith(List)
endWith(Name name)
startsWith(List rdns)
startsWith(Name name)
isEmpty()
您可以使用compareTo\(\)
对 LdapName 实例列表进行排序。 equals\(\)
方法使您可以确定两个 LdapName 在语法上是否相等。如果两个 LdapName 具有相同的 Sequences(完全匹配大小写),则它们相等。
使用startsWith\(\)
和endsWith\(\)
,您可以了解一个 LdapName 是另一个 LdapName 的开始还是结束。即,一个 LdapName 是另一个 LdapName 的后缀还是前缀。
便捷方法isEmpty\(\)
使您能够确定 LdapName 是否具有零个分量。您也可以使用表达式size\(\) == 0
执行相同的检查。
这是一个使用以下比较方法的示例CompareLdapNames。
LdapName one = new LdapName("cn=Vincent Ryan, ou=People, o=JNDITutorial");
LdapName two = new LdapName("cn=Vincent Ryan");
LdapName three = new LdapName("o=JNDITutorial");
LdapName four = new LdapName("");
System.out.println(one.equals(two)); // false
System.out.println(one.startsWith(three)); // true
System.out.println(one.endsWith(two)); // true
System.out.println(one.startsWith(four)); // true
System.out.println(one.endsWith(four)); // true
System.out.println(one.endsWith(three)); // false
System.out.println(one.isEmpty()); // false
System.out.println(four.isEmpty()); // true
System.out.println(four.size() == 0); // true
获取字符串 表示形式
以下方法为您提供根据 RFC 2253 中指定的语法格式设置的 LDAP 名称的字符串 表示形式:
当您使用 LdapName 构造函数时,您将提供 LDAP 名称的字符串 表示形式并获取 LdapName 实例。要执行相反的操作,即获取 LdapName 实例的字符串 表示形式,请使用toString\(\)
。 toString\(\)
的结果可以反馈给构造函数,以产生一个与原始 LdapName 实例相等的 LdapName 实例。这是一个示例LdapNametoString:
LdapName dn = new LdapName(name);
String str = dn.toString();
System.out.println(str);
LdapName dn2 = new LdapName(str);
System.out.println(dn.equals(dn2)); // true
LdapName 作为上下文方法的参数
Context 方法要求将复合名称或复合名称作为参数传递给其方法。因此,LdapName 可以直接传递给上下文方法,如LookupLdapName所示:
// Create the initial context
Context ctx = new InitialContext(env);
// An LDAP name
LdapName dn = new LdapName("ou=People,o=JNDITutorial");
// Perform the lookup using the dn
Object obj = ctx.lookup(dn);
同样,当 Context 方法从 list(),listBindings()或 search()操作返回结果时,可以通过调用getNameInNamespace()来检索 DN。可以直接从 DN 构造 LdapName,如示例RetrievingLdapName所示:
while (answer.hasMore()) {
SearchResult sr = (SearchResult) answer.next();
String name = sr.getNameInNamespace();
System.out.println(name);
LdapName dn = new LdapName(name);
// do something with the dn