操纵相对字符串 名称(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 的字符串 表示形式,可以使用:

toString()

当您使用带有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 值的自动转义和转义:

escapeValue()
unescapeValue()

下面的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);