操纵相对字符串 名称(RDN)
类别javax.naming.ldap.Rdn表示RFC 2253中指定的相对专有名称(RDN)。如Manipulating LdapName类中所述,RDN 代表 DN 的组成部分。 RDN 由类型和值对组成。 RDN 的示例是:
-
OU=Sun
-
OU=Sales+CN=J\.Smith
.
上面的示例显示了多值 RDN 的表示形式。
Rdn类提供用于访问 RDN 的名称/值对,获取其字符串 表示,检索Attributes视图,比较和确定 RDN 的相等性的方法,以及用于对 RDN 的值部分进行转义和不转义的方法。
Rdn
类是不可变的。
构建 Rdn
如果 Rdn 是单个名称/值配对的 RDN,则可以使用指定的名称和值对构造 Rdn。对于多值 RDN,应创建一个由所有名称/值对组成的属性集,并使用以Attributes
作为参数的构造函数。您还可以根据RFC 2253中指定的字符串 表示形式来创建 Rdn。最后,您可以使用其复制构造函数克隆 Rdn。这是使用不同类型的构造函数创建 RDN 的example。
Rdn rdn1 = new Rdn("ou= Juicy\\, Fruit");
System.out.println("rdn1:" + rdn1.toString());
Rdn rdn2 = new Rdn(rdn1);
System.out.println("rdn2:" + rdn2.toString());
Attributes attrs = new BasicAttributes();
attrs.put("ou", "Juicy, Fruit");
attrs.put("cn", "Mango");
Rdn rdn3 = new Rdn(attrs);
System.out.println("rdn3:" + rdn3.toString());
Rdn rdn4 = new Rdn("ou", "Juicy, Fruit");
System.out.println("rdn4:" + rdn4.toString());
访问 RDN 的类型/值对
和 RDN 的类型/值可以使用以下方法获得:
getType()
getValue()
toAttributes()
对于由单个类型/值对组成的 RDN,getType()方法返回类型,而getValue()方法返回 RDN 的值。方法toAttributes()返回类型/值对的属性视图。下面的example打印 RDN 的类型/值对。
Attributes attrs = new BasicAttributes();
attrs.put("o", "Yellow");
attrs.put("cn", "Mango");
// create a binary value for the RDN
byte[] mangoJuice = new byte[6];
for (int i = 0; i < mangoJuice.length; i++) {
mangoJuice[i] = (byte) i;
}
attrs.put("ou", mangoJuice);
Rdn rdn = new Rdn(attrs);
System.out.println();
System.out.println("size:" + rdn.size());
System.out.println("getType(): " + rdn.getType());
System.out.println("getValue(): " + rdn.getValue());
// test toAttributes
System.out.println();
System.out.println("toAttributes(): " + rdn.toAttributes());
获取字符串 表示形式
为了获取根据RFC 2253中指定的语法格式设置的 RDN 的字符串 表示形式,可以使用:
当您使用带有String
参数的 Rdn 构造函数时,您将提供 RDN 的字符串 表示形式,并获取一个 Rdn 实例。要执行相反的操作,即获取 Rdn 实例的字符串 表示形式,请使用 toString()。 toString()的结果可以反馈到 Rdn 构造函数以生成与原始 Rdn 实例相等的 Rdn 实例。
这是example:
Rdn rdn = new Rdn("cn=Juicy\\,Fruit");
String str = rdn.toString();
System.out.println(str);
Rdn rdn2 = new Rdn(str);
System.out.println(rdn.equals(rdn2)); // true
Comparing RDNs
下面的方法可以比较 RDN:
equals(Object Rdn)
compareTo(Object Rdn)
您可以使用 compareTo()对 Rdn 实例列表进行排序。 equals()使您可以确定两个 Rdn 在语法上是否相等。如果两个 Rdn 具有相同(大小写完全匹配)的类型/值对,则它们相等。多值 RDN 中的组件 Sequences 并不重要。
这是example:
Rdn one = new Rdn("ou=Sales+cn=Bob");
Rdn two = new Rdn("cn=Bob+ou=Sales");
Rdn three = new Rdn("ou=Sales+cn=Bob+c=US");
Rdn four = new Rdn("cn=lowercase");
Rdn five = new Rdn("cn=LowerCASE");
System.out.println(one.equals(two)); // true
System.out.println(two.equals(three)); // false
System.out.println(one.equals(three)); // false
System.out.println(four.equals(five)); // true
特殊字符的转义和转义
Rdn 类的最佳用途之一是必须处理由特殊字符组成的 DN。它会自动对特殊字符进行转义和转义。根据RFC 2253,具有''(反斜杠),','(逗号),(加号)等字符具有特定的语义。您可以在 RFC2253 中找到所有特殊字符的列表。当这些字符在 DN 中用作 Literals 时,必须使用''(黑斜线)对其进行转义。
例如,考虑一个 RDN:cn=Juicy, Fruit
Juicy 和 Fruit 之间出现的字符,(逗号)是一个特殊字符,需要用''(黑斜线)进行转义。语法格式为 RDN 的结果如下所示:cn=Juicy\, Fruit
但是,根据 Java Language String 语法,''(反斜杠)字符本身是一个特殊字符,需要再次使用''(反斜杠)进行转义。 Java 语言字符串 格式和RFC 2253都使用''(反斜杠)转义特殊字符。因此,Java 格式化的 RDN 字符串 如下所示:cn=Juicy\\, Fruit
注意,上述格式化规则仅适用于 Rdn 的值组成部分。 Rdn
类提供了两种static
方法来处理 RDN 值的自动转义和转义:
下面的example显示了如何获取 DN 的字符串 表示形式,而不必处理RFC 2253中定义的特殊字符的语法。
// DN with ',' (comma)
String unformatted = "Juicy, Fruit";
String formatted = Rdn.escapeValue(unformatted);
LdapName dn = new LdapName("cn=" + formatted);
System.out.println("dn:" + dn);
unformatted = "true+false";
formatted = Rdn.escapeValue(unformatted);
dn = new LdapName("cn=" + formatted);
System.out.println("dn:" + dn);
// DN with a binary value as one one of its attribute value
byte[] bytes = new byte[] {1, 2, 3, 4};
formatted = Rdn.escapeValue(bytes);
System.out.println("Orig val: " + bytes + "Escaped val: " + formatted);
类似地,使用静态unescapeValue\(\)
方法可以从格式化后的值中获取原始字符串。 Here是用于检索原始值的示例。
// DN with ',' (comma)
String unformatted = "Juicy, Fruit";
String formatted = Rdn.escapeValue(unformatted);
System.out.println("Formatted:" + formatted);
Object original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);
// DN with a '+' (plus)
unformatted = "true+false";
formatted = Rdn.escapeValue(unformatted);
System.out.println("Formatted:" + formatted);
original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);
// DN with a binary value as one one of its attribute value
byte[] bytes = new byte[] {1, 2, 3, 4};
formatted = Rdn.escapeValue(bytes);
System.out.println("Formatted:" + formatted);
original = Rdn.unescapeValue(formatted);
System.out.println("Original:" + original);