Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言功能的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参见JDK发布说明。
JNDI和LDAP模型都定义了一个层次化的命名空间,在其中命名对象。命名空间中的每个对象都可以具有用于搜索对象的属性。在这个高级别上,这两个模型是相似的,因此JNDI很好地映射到了LDAP。
你可以将LDAP条目视为JNDI的DirContext。每个LDAP条目包含一个名称和一组属性,以及一个可选的子条目集合。例如,LDAP条目"o=JNDITutorial"的属性可能是"objectclass"和"o",并且它可能具有"ou=Groups"和"ou=People"这两个子条目。
在JNDI中,LDAP条目"o=JNDITutorial"被表示为一个具有名称"o=JNDITutorial"的上下文,该上下文有两个子上下文,分别命名为"ou=Groups"和"ou=People"。LDAP条目的属性由Attributes接口表示,而单个属性由Attribute接口表示。
有关如何通过JNDI访问LDAP操作的详细信息,请参阅本教程的下一部分。
由于联邦性的结果,您在向JNDI的上下文方法中提供的名称可以跨多个命名空间。这些称为复合名称。在使用JNDI访问LDAP服务时,您应该知道正斜杠字符("/")在字符串名称中对JNDI具有特殊含义。如果LDAP条目的名称包含此字符,则需要进行转义(使用反斜杠字符("\"))。例如,具有名称"cn=O/R"的LDAP条目必须以字符串"cn=O\\/R"的形式呈现给JNDI上下文方法。有关名称的更多信息,请查看JNDI教程。LdapName和Rdn类简化了LDAP名称的创建和操作。
LDAP名称在协议中使用时始终是完全限定的名称,它们标识从LDAP命名空间的根(由服务器定义)开始的条目。以下是一些完全限定LDAP名称的示例。
cn=Ted Geisel, ou=Marketing, o=某个公司, c=gb cn=Vinnie Ryan, ou=People, o=JNDITutorial
然而,在JNDI中,名称始终是相对的;也就是说,您总是相对于上下文命名对象。例如,您可以将条目"cn=Vinnie Ryan"相对于名为"ou=People, o=JNDITutorial"的上下文进行命名。或者您可以将条目"cn=Vinnie Ryan, ou=People"相对于名为"o=JNDITutorial"的上下文进行命名。或者,您可以创建一个指向LDAP服务器命名空间根的初始上下文,并将条目命名为"cn=Vinnie Ryan, ou=People, o=JNDITutorial"。
在JNDI中,您还可以使用LDAP URL来命名LDAP条目。请参阅JNDI教程中的LDAP URL讨论。