操纵 LdapName(专有名称)
原文: https://docs.oracle.com/javase/tutorial/jndi/newstuff/ldapname.html
LDAP 的字符串表示使用专有名称(DN)。用于表示 DN 的字符串格式在 RFC 2253 中指定。 DN 由称为相对专有名称(RDN)的组件组成。以下是 DN 的示例:
“CN = John Smith,O = Isode Limited,C = GB”
它由以下 RDN 组成:
- CN =约翰史密斯
- O = Isode Limited
- C = GB
下面的类分别代表 DN 和 RDN。
LdapName 类实现 javax.naming.Name
接口类似于 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”
的输入运行此示例会产生以下结果:
cn=Mango,ou=Fruits,o=Food has 3 RDNs:
o=Food
ou=Fruits
cn=Mango
LdapName 类包含以 RDN 和字符串形式访问其组件,修改 LdapName,比较两个 LdapNames 是否相等以及获取名称的字符串表示形式的方法。
访问 LDAP 名称的名称组件:
以下是可用于将名称组件作为 RDN 和字符串进行访问的方法:
getRdn(int posn)
得到(int posn)
getRdns()
getAll()
getPrefix(int posn)
getSuffix(int posn)
克隆()
要在 LdapName 中的特定位置检索组件,请使用 getRdn()或 get()。前面的构造器示例显示了它的使用示例。 getRdns()
返回所有 RDN 的列表, getAll()
返回 LdapName 的所有组件作为枚举。
最右边的 RDN 位于索引 0,最左边的 RDN 位于索引 n-1。例如,可分辨名称:“cn =芒果,ou =水果,o =食物”
按以下顺序编号,范围从 0 到 2: {o =食物,ou =水果, cn =芒果}
您还可以将 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 ,String comp)
addAll(List suffixRdns)
addAll(名称后缀)
addAll(int posn,List suffixRdns)
addAll(int posn,Name suffix)
删除(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(对象名称)
等于(对象名称)
endsWith(List)
endWith(名称)
起始(列表 rdns)
startsWith(名称)
isEmpty()
您可以使用compareTo()
对 LdapName 实例列表进行排序。 equals()
方法可以让您确定两个 LdapNames 在语法上是否相等。如果两个 LdapNames 在相同的顺序中具有相同(大小写完全匹配)的组件,则它们是相等的。
使用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 方法的参数
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。 LdapName 可以直接从 DN 构造,如示例 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