JNDI 作为 LDAP API

JNDI 和 LDAP 模型都定义了在其中命名对象的分层名称空间。命名空间中的每个对象都可以具有可用于搜索对象的属性。在较高的级别上,这两种模型是相似的,因此 JNDI 很好地 Map 到 LDAP 也就不足为奇了。

Models

您可以将 LDAP 条目视为 JNDI DirContext。每个 LDAP 条目都包含一个名称和一组属性,以及一组可选的子条目。例如,LDAP 条目"o=JNDITutorial"的属性"objectclass""o"作为其子属性"ou=Groups""ou=People"作为其子项。

在 JNDI 中,LDAP 条目"o=JNDITutorial"被表示为名称为"o=JNDITutorial"的上下文,该上下文具有两个子上下文,分别为"ou=Groups""ou=People"。 LDAP 条 Object 属性由Attributesinterface表示,而各个属性由Attributeinterface表示。

LDAP 和 JNDI 的表示形式

有关如何通过 JNDI 访问 LDAP 操作的详细信息,请参见本课的下一部分

Names

作为联合的结果,您为 JNDI 的上下文方法提供的名称可以跨越多个名称空间。这些称为复合名称。使用 JNDI 访问 LDAP 服务时,应注意,字符串 名称中的正斜杠字符(“ /”)对 JNDI 具有特殊含义。如果 LDAP 条 Object 名称包含此字符,则需要对其进行转义(使用反斜杠字符(“ ”))。例如,必须将名称为"cn=O/R"的 LDAP 条目作为字符串"cn=O\\/R"呈现给 JNDI 上下文方法。有关名称的更多信息,请查看JNDI TutorialLdapNameRdn类简化了 LDAP 名称的创建和操作。

协议中使用的 LDAP 名称始终是完全限定名称,用于标识从 LDAP 名称空间(由服务器定义)的根开始的条目。以下是一些标准 LDAP 名称的示例。

cn=Ted Geisel, ou=Marketing, o=Some Corporation, c=gb
cn=Vinnie Ryan, ou=People, o=JNDITutorial

但是,在 JNDI 中,名称始终是* relative *;也就是说,您总是相对于上下文命名一个对象。例如,您可以相对于上下文"ou=People, o=JNDITutorial"命名条目"cn=Vinnie Ryan"。或者,您可以相对于上下文"o=JNDITutorial"命名条目"cn=Vinnie Ryan, ou=People"。或者,您可以创建一个指向 LDAP 服务器名称空间根目录的初始上下文,并将其命名为"cn=Vinnie Ryan, ou=People, o=JNDITutorial"

在 JNDI 中,还可以使用 LDAP URL 命名 LDAP 条目。请参阅JNDI Tutorial中的 LDAP URL 讨论。