文档

Java™ 教程
隐藏目录
操作相对专有名称(RDN)
路径: Java命名和目录接口
课程: JDK 5.0和JDK 6的新功能

操作相对区分名(RDN)

javax.naming.ldap.Rdn表示在RFC 2253中指定的相对可分辨名称(RDN)。 RDN代表DN的组成部分,如Manipulating LdapName中所解释的那样。 RDN由类型和值对组成。 RDN的示例包括:

Rdn类提供了访问RDN的名称/值对的方法,获取其字符串表示形式,检索Attributes视图,比较和确定RDN的相等性以及转义和反转义RDN的值部分的方法。

Rdn类是不可变的。

构造Rdn

如果是单个名称/值对的RDN,则可以使用指定的名称和值对构造Rdn。对于多值RDN,应创建包含所有名称/值对的属性集,并使用以Attributes作为参数的构造函数。您还可以根据RFC 2253中指定的字符串表示形式创建Rdn。最后,您可以使用其副本构造函数克隆Rdn。这是一个使用不同类型构造函数创建RDN的示例

        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()返回类型/值对的属性视图。下面的示例打印了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实例。

下面是一个示例

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

比较RDNs

以下方法用于比较RDNs:

equals(Object Rdn)
compareTo(Object Rdn)

你可以使用compareTo()来对Rdn实例的列表进行排序。equals()方法可以判断两个Rdn是否在语法上相等。如果两个Rdn具有相同的(大小写匹配)类型/值对,则它们是相等的。在多值RDN中,组件的顺序是不重要的。

这是一个示例

        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,字符'\'(反斜杠)、','(逗号)、+(加号)等具有特定的语义。在DN中将这些字符作为字面值使用时,必须使用'\'(反斜杠)进行转义。

例如,考虑一个RDN:cn=Juicy, Fruit 在Juicy和Fruit之间出现的逗号是一个特殊字符,需要使用'\'(反斜杠)进行转义。转义后的语法格式化的RDN如下:cn=Juicy\, Fruit 然而,'\'(反斜杠)字符本身是Java语言字符串语法中的特殊字符,需要再次使用'\'(反斜杠)进行转义。Java语言字符串格式和RFC 2253都使用'\'(反斜杠)来转义特殊字符。因此,Java格式化的RDN字符串如下:cn=Juicy\\, Fruit 注意,上述的格式化规则仅适用于Rdn的值组件。Rdn类提供了两个静态方法来处理RDN值的自动转义和反转义:

escapeValue()
unescapeValue()

下面的示例展示了如何获取DN的字符串表示,而无需处理RFC 2253中定义的处理特殊字符的语法。

    // 使用逗号分隔的DN
    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中包含二进制值作为其中一个属性的值
    byte[] bytes = new byte[] {1, 2, 3, 4};
    formatted = Rdn.escapeValue(bytes);
    System.out.println("Orig val: " + bytes + "Escaped val: " + formatted);

同样地,使用静态的 unescapeValue() 方法,可以从格式化的值中获取原始字符串。 这里 有一个检索原始值的示例。

    // 使用逗号分隔的DN
    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中包含加号
    unformatted = "true+false";
    formatted = Rdn.escapeValue(unformatted); 
    System.out.println("Formatted:" + formatted);
    original = Rdn.unescapeValue(formatted);
    System.out.println("Original:" +  original);  

    // DN中包含二进制值作为其中一个属性的值
    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);  

上一页:操作LdapName(可分辨名称)
下一页:设置Ldap操作的超时时间