Java 中文官方教程 2022 版(四十六)(3)https://developer.aliyun.com/article/1488458
命名概念
在任何计算系统中的一个基本设施是命名服务——通过名称与对象关联并根据其名称找到对象的方法。在几乎任何计算机程序或系统中使用时,您总是在命名一个对象或另一个对象。例如,当您使用电子邮件系统时,必须提供收件人的名称。要访问计算机中的文件,必须提供其名称。命名服务允许您根据名称查找对象。
命名服务的主要功能是将人们友好的名称映射到对象,例如地址、标识符或通常由计算机程序使用的对象。
例如,Internet 域名系统(DNS)将机器名称映射到 IP 地址:
www.example.com ==> 192.0.2.5
文件系统将文件名映射到程序可以使用的文件引用,以访问文件的内容。
c:\bin\autoexec.bat ==> File Reference
这两个示例也说明了命名服务存在的广泛规模范围——从在互联网上命名对象到在本地文件系统上命名文件。
名称
要在命名系统中查找对象,您需要提供对象的名称。命名系统确定名称必须遵循的语法。这种语法有时被称为命名系统的命名约定。名称由组件组成。名称的表示包括一个组件分隔符,标记名称的组件。
| 命名系统 | 组件分隔符 | 名称 |
| UNIX 文件系统 | “/” | /usr/hello |
| DNS | “.” | sales.Wiz.COM |
| LDAP | “,” 和 “=” | cn=Rosanna Lee, o=Sun, c=US |
UNIX 文件系统的命名约定是,文件的命名来自于相对于文件系统根目录的路径,路径中的每个组件从左到右使用斜杠字符(“/”)分隔。例如,UNIX 的路径名 /usr/hello,命名了位于文件系统根目录中的文件目录usr中的文件hello。
DNS 命名约定要求 DNS 名称中的组件从右到左排序,并用点字符(“.”)分隔。因此,DNS 名称sales.Wiz.COM命名了一个名为sales的 DNS 条目,相对于 DNS 条目Wiz.COM。而 DNS 条目Wiz.COM又命名了一个名为Wiz的条目,位于COM条目中。
轻量级目录访问协议(LDAP)命名约定按从右到左的顺序排列组件,以逗号字符(“,”)分隔。因此,LDAP 名称cn=Rosanna Lee, o=Sun, c=US指定了一个 LDAP 条目cn=Rosanna Lee,相对于条目o=Sun,后者又相对于c=us。LDAP 还有一个规则,即名称的每个组件必须是一个名称/值对,名称和值之间用等号字符(“=”)分隔。
绑定
名称与对象的关联称为绑定。文件名绑定到文件。
DNS 包含将机器名称映射到 IP 地址的绑定。LDAP 名称绑定到 LDAP 条目。
参考和地址
根据命名服务的不同,一些对象无法直接存储在命名服务中;也就是说,不能将对象的副本放入命名服务中。相反,它们必须通过引用存储;也就是说,将指向对象的指针或引用放入命名服务中。引用表示如何访问对象的信息。通常,它是一种紧凑的表示形式,可用于与对象通信,而对象本身可能包含更多状态信息。使用引用,您可以联系对象并获取有关对象的更多信息。
例如,飞机对象可能包含飞机的乘客和机组人员列表,其飞行计划,燃料和仪表状态,以及其航班号和起飞时间。相比之下,飞机对象引用可能只包含其航班号和起飞时间。引用是关于飞机对象信息的更紧凑表示,并可用于获取附加信息。例如,文件对象使用文件引用访问。另外,打印机对象可能包含打印机的状态,如当前队列和纸盒中的纸张量。另一方面,打印机对象引用可能只包含有关如何到达打印机的信息,如其打印服务器名称和打印协议。
尽管一般来说引用可以包含任意信息,但将其内容称为地址(或通信终点)是有用的:关于如何访问对象的具体信息。
为简单起见,本教程在不需要区分两者时使用“对象”来指代对象和对象引用。
上下文
上下文是一组名称到对象的绑定。每个上下文都有一个相关的命名约定。上下文始终提供一个查找(解析)操作,返回对象,通常还提供绑定名称、解绑名称和列出绑定名称等操作。一个上下文对象中的名称可以绑定到另一个具有相同命名约定的上下文对象(称为子上下文)。
UNIX 文件系统中的文件目录,例如/usr,代表一个上下文。相对于另一个文件目录命名的文件目录代表一个子上下文(UNIX 用户将其称为子目录)。也就是说,在文件目录/usr/bin中,目录bin是usr的子上下文。DNS 域,例如COM,代表一个上下文。相对于另一个 DNS 域命名的 DNS 域代表一个子上下文。对于 DNS 域Sun.COM,DNS 域Sun是COM的子上下文。
最后,LDAP 条目,例如c=us,代表一个上下文。相对于另一个 LDAP 条目命名的 LDAP 条目代表一个子上下文。对于 LDAP 条目o=sun,c=us,条目o=sun是c=us的子上下文。
命名系统和命名空间
命名系统是同一类型上下文的连接集合(它们具有相同的命名约定),并提供一组共同的操作。
实现 DNS 的系统是一个命名系统。使用 LDAP 进行通信的系统也是一个命名系统。
命名系统为其客户提供命名服务,用于执行与命名相关的操作。命名服务通过其自己的接口访问。DNS 提供将机器名称映射到 IP 地址的命名服务。LDAP 提供将 LDAP 名称映射到 LDAP 条目的命名服务。文件系统提供将文件名映射到文件和目录的命名服务。
命名空间是命名系统中所有可能名称的集合。UNIX 文件系统具有一个命名空间,其中包含该文件系统中所有文件和目录的名称。DNS 命名空间包含 DNS 域和条目的名称。LDAP 命名空间包含 LDAP 条目的名称。
目录概念
原文:
docs.oracle.com/javase/tutorial/jndi/concepts/directory.html
许多命名服务都扩展了目录服务。目录服务将名称与对象关联,并将这些对象与属性关联起来。
目录服务 = 命名服务 + 包含属性的对象
你不仅可以通过名称查找对象,还可以获取对象的属性或根据其属性搜索对象。
一个例子是电话公司的目录服务。它将订户的姓名映射到他的地址和电话号码。计算机的目录服务非常类似于电话公司的目录服务,因为两者都可以用来存储诸如电话号码和地址之类的信息。然而,计算机的目录服务更加强大,因为它可以在线使用,并且可以用来存储各种信息,这些信息可以被用户、程序甚至计算机本身和其他计算机利用。
目录对象表示计算环境中的一个对象。例如,目录对象可以用来表示打印机、人员、计算机或网络。目录对象包含描述其所代表对象的属性。
属性
目录对象可以具有属性。例如,打印机可以由具有其速度、分辨率和颜色等属性的目录对象表示。用户可以由具有用户的电子邮件地址、各种电话号码、邮寄地址和计算机帐户信息等属性的目录对象表示。
属性具有属性标识符和一组属性值。属性标识符是一个标记,独立于其值标识属性。例如,两个不同的计算机帐户可能具有一个"mail"属性;"mail"是属性标识符。属性值是属性的内容。例如,电子邮件地址可能有:
Attribute Identifier : Attribute Value mail john.smith@example.com
目录和目录服务
目录是一组连接的目录对象。目录服务是提供用于在目录中创建、添加、删除和修改与对象关联的属性的操作的服务。该服务通过其自己的接口访问。
可能有许多目录服务的示例。
网络信息服务(NIS)
NIS 是 UNIX 操作系统上可用的目录服务,用于存储与机器、网络、打印机和用户相关的系统信息。
Oracle 目录服务器是一个基于互联网标准LDAP的通用目录服务。
搜索服务
你可以通过向目录服务提供其名称来查找目录对象。另外,许多目录,比如基于 LDAP 的目录,支持搜索的概念。当你搜索时,你可以提供一个查询,其中包含一个逻辑表达式,你可以在其中指定对象必须具有的属性。这个查询被称为搜索过滤器。这种搜索方式有时被称为反向查找或基于内容的搜索。目录服务会搜索并返回满足搜索过滤器的对象。
例如,你可以查询目录服务以查找:
- 所有具有属性
"age"大于 40 岁的用户。 - 所有 IP 地址以"192.113.50"开头的机器。
结合命名和目录服务
目录通常将它们的对象按层次结构排列。例如,LDAP 将所有目录对象排列在一棵树中,称为目录信息树(DIT)。在 DIT 中,一个组织对象,例如,可能包含可能又包含人员对象的组对象。当目录对象以这种方式排列时,它们除了作为属性容器外还扮演了命名上下文的角色。
课程:JNDI 概述
Java 命名和目录接口(JNDI)是一个提供命名和目录功能的应用程序编程接口(API),用于使用 Java™ 编程语言编写的应用程序。它被定义为独立于任何特定目录服务实现。因此,各种目录 - 新的、新兴的和已部署的都可以以一种通用的方式访问。
架构
JNDI 架构包括 API 和服务提供者接口(SPI)。Java 应用程序使用 JNDI API 访问各种命名和目录服务。SPI 使各种命名和目录服务能够透明地插入,从而允许使用 JNDI API 的 Java 应用程序访问它们的服务。请参见下图:
打包
JNDI 包含在 Java SE 平台中。要使用 JNDI,您必须具有 JNDI 类和一个或多个服务提供者。JDK 包含以下命名/目录服务的服务提供者:
- 轻量级目录访问协议(LDAP)
- 公共对象请求代理体系结构(CORBA)公共对象服务(COS)名称服务
- Java 远程方法调用(RMI)注册表
- 域名服务(DNS)
其他服务提供者可以从JNDI 页面下载或从其他供应商获取。
JNDI 分为五个包:
- javax.naming
- javax.naming.directory
- javax.naming.ldap
- javax.naming.event
- javax.naming.spi
课程的下一部分简要描述了 JNDI 包。
命名包
原文:
docs.oracle.com/javase/tutorial/jndi/overview/naming.html
javax.naming包含用于访问命名服务的类和接口。
上下文
javax.naming包定义了一个Context接口,这是查找、绑定/解绑、重命名对象以及创建和销毁子上下文的核心接口。
查找
最常用的操作是lookup()。您提供lookup()要查找的对象的名称,它将返回绑定到该名称的对象。
绑定
listBindings()返回一个名称到对象绑定的枚举。绑定是一个包含绑定对象的名称、对象类的名称和对象本身的元组。
列表
list()类似于listBindings(),只是它返回一个包含对象名称和对象类名称的名称枚举。list()对于诸如浏览器之类的应用程序很有用,这些应用程序希望发现上下文中绑定的对象的信息,但不需要所有实际对象。虽然listBindings()提供了相同的信息,但它可能是一个更昂贵的操作。
名称
Name是表示通用名称的接口——一个有序的零个或多个组件的序列。命名系统使用此接口来定义遵循其约定的名称,如命名和目录概念课程中所述。
引用
对象以不同方式存储在命名和目录服务中。引用可能是对象的非常紧凑的表示。
JNDI 定义了Reference类来表示引用。引用包含有关如何构造对象副本的信息。JNDI 将尝试将从目录查找的引用转换为它们所代表的 Java 对象,以便 JNDI 客户端产生存储在目录中的是 Java 对象的错觉。
初始上下文
在 JNDI 中,所有命名和目录操作都是相对于上下文执行的。没有绝对的根。因此,JNDI 定义了一个InitialContext,它提供了命名和目录操作的起始点。一旦您有了初始上下文,您可以使用它来查找其他上下文和对象。
异常
JNDI 定义了一个类层次结构,用于在执行命名和目录操作过程中可能抛出的异常。这个类层次结构的根是NamingException。对于对特定异常感兴趣的程序,可以捕获异常的相应子类。否则,它们应该捕获NamingException。
目录和 LDAP 包
目录包
javax.naming.directory包扩展了javax.naming包,提供了访问目录服务以及命名服务的功能。该包允许应用程序检索存储在目录中的对象相关的属性,并使用指定的属性搜索对象。
目录上下文
DirContext接口代表一个目录上下文。DirContext还通过扩展Context接口来充当命名上下文。这意味着任何目录对象也可以提供命名上下文。它定义了用于检查和更新与目录条目关联的属性的方法。
属性
您可以使用getAttributes()方法检索与目录条目关联的属性(您提供名称)。使用modifyAttributes()方法修改属性。您可以使用此操作添加、替换或删除属性和/或属性值。
搜索
DirContext包含用于执行基于内容的目录搜索的方法。在最简单和最常见的用法中,应用程序指定一组可能具有特定值的属性,并将此属性集提交给search()方法。其他重载形式的search()支持更复杂的搜索过滤器。
LDAP 包
javax.naming.ldap 包含了用于使用特定于LDAP v3的功能的类和接口,这些功能不在更通用的javax.naming.directory包中。事实上,大多数使用 LDAP 的 JNDI 应用程序会发现javax.naming.directory包已经足够,并且根本不需要使用javax.naming.ldap包。这个包主要是为那些需要使用“扩展”操作、控件或未经请求的通知的应用程序而设计的。
“扩展”操作
除了指定了搜索和修改等明确定义的操作之外,LDAP v3 (RFC 2251)还指定了在 LDAP 客户端和服务器之间传输尚未定义操作的方法。这些操作被称为*“扩展”操作*。一个“扩展”操作可以由标准组织(如互联网工程任务组)或供应商定义。
控件
LDAP v3允许任何请求或响应通过尚未定义的修饰符进行增强,称为控件。与请求一起发送的控件是请求控件,与响应一起发送的控件是响应控件。控件可以由标准组织(如 IETF)或供应商定义。请求控件和响应控件不一定是成对的,也就是说,并非每个发送的请求控件都需要有相应的响应控件,反之亦然。
未经请求的通知
除了客户端和服务器之间的正常请求/响应交互方式之外,LDAP v3还指定了未经请求的通知–这些消息是从服务器异步发送给客户端的,而不是响应于任何客户端请求。
LDAP 上下文
LdapContext 接口代表了执行“扩展”操作、发送请求控件和接收响应控件的上下文。如何使用这些功能的示例在 JNDI 教程的控件和扩展课程中有描述。
事件和服务提供者包
事件包
javax.naming.event包含用于支持命名和目录服务中事件通知的类和接口。事件通知在事件通知指南中有详细描述。
事件
一个NamingEvent代表由命名/目录服务生成的事件。事件包含一个类型,用于标识事件类型。例如,事件类型被分类为影响命名空间的事件,如“对象添加”,以及不影响命名空间的事件,如“对象更改”。
监听器
一个NamingListener是一个监听NamingEvent的对象。每种事件类型的类别都有相应类型的NamingListener。例如,一个NamespaceChangeListener代表一个对命名空间更改事件感兴趣的监听器,而一个ObjectChangeListener代表一个对对象更改事件感兴趣的监听器。
要接收事件通知,监听器必须注册到EventContext或EventDirContext中。一旦注册,当命名/目录服务中发生相应更改时,监听器将接收事件通知。有关事件通知的详细信息可以在JNDI 教程中找到。
服务提供者包
javax.naming.spi包提供了不同命名/目录服务提供者的开发者可以开发和连接其实现的手段,以便从使用 JNDI 的应用程序中访问相应服务。
插件架构
javax.naming.spi包允许动态地插入不同的实现。这些实现包括初始上下文和可以从初始上下文访问的上下文。
Java 对象支持
javax.naming.spi包支持 lookup 及其相关方法的实现者返回对于 Java 程序员而言自然且直观的 Java 对象。例如,如果你从目录中查找打印机名称,那么你很可能期望得到一个打印机对象来进行操作。这种支持以 object factories 的形式提供。
这个包还提供了支持进行相反操作的功能。也就是说,Context.bind()及其相关方法的实现者可以接受 Java 对象,并将这些对象存储在底层命名/目录服务可接受的格式中。这种支持以 state factories 的形式提供。
多个命名系统(联邦)
JNDI 操作允许应用程序提供跨多个命名系统的名称。在完成操作的过程中,一个服务提供者可能需要与另一个服务提供者交互,例如将操作传递给下一个命名系统继续进行。这个包提供了不同提供者合作完成 JNDI 操作的支持。
有关服务提供者机制的详细信息可以在JNDI 教程中找到。
课程:软件设置
所需软件
以下是您需要的软件/系统列表:
- Java 平台软件
- 服务提供者软件
- 命名和目录服务器软件
Java 平台软件
JNDI 包含在 Java SE 平台中。
要运行小程序,请在 Microsoft Edge 上使用 IE 模式。请参阅Microsoft Edge + Internet Explorer 模式:入门指南。
服务提供者软件
JNDI API 是用于访问任何命名或目录服务的通用 API。通过在 JNDI 下插入服务提供者,可以实现对命名或目录服务的实际访问。有关 JNDI 架构和服务提供者角色的概述,请参阅 JNDI 概述课程。
服务提供者是将 JNDI API 映射到对命名或目录服务器的实际调用的软件。通常,服务提供者的角色与命名/目录服务器的角色不同。在客户端/服务器软件术语中,JNDI 和服务提供者是客户端(称为JNDI 客户端),而命名/目录服务器是服务器。
客户端和服务器可以以许多方式进行交互。在一种常见的方式中,它们使用网络协议,以便客户端和服务器可以在网络环境中独立存在。服务器通常支持许多不同的客户端,不仅限于 JNDI 客户端,只要客户端符合指定的协议。JNDI 不规定 JNDI 客户端和服务器之间的任何特定交互方式。例如,在一个极端情况下,客户端和服务器可以是同一实体。
您需要获取将要使用的服务提供者的类。例如,如果您计划使用 JNDI 访问 LDAP 目录服务器,则需要 LDAP 服务提供者的软件。
JDK 附带以下服务提供者:
- 轻量级目录访问协议(LDAP)
- CORBA 公共对象服务命名(COS 命名)
- RMI 注册表
- 域名服务(DNS)
如果您对其他提供者感兴趣,请查看JNDI 页面以获取下载信息。
本教程仅使用 LDAP 服务提供者。使用 LDAP 服务提供者时,您需要设置自己的服务器或访问现有服务器,如下所述。
命名和目录服务器软件
一旦您获得了服务提供商软件,您就需要设置或访问相应的命名/目录服务器。设置命名/目录服务器通常是网络系统管理员的工作。不同的供应商对其命名/目录服务器有不同的安装程序。有些在服务器安装之前需要特殊的机器权限。您应该查阅命名/目录服务器软件的安装说明。
在本教程中的目录示例中,您需要访问一个 LDAP 服务器。如果您想快速了解 LDAP 是什么,请查看这里。您可以使用您选择的任何符合 LDAP 标准的服务器。Oracle Directory Server 在许多平台上运行,包括 Windows,可在以下网址进行评估:Oracle Directory Server。
您也可以在下面下载一个免费的 LDAP 服务器:
一个公开访问的服务器位于:ldap://ldap.openldap.org 命名上下文:dc=OpenLDAP,dc=org
LDAP 设置
原文:
docs.oracle.com/javase/tutorial/jndi/software/content.html
下面是构建访问 LDAP 目录服务器的 Java 应用程序涉及的步骤。
- 安装 Java 平台软件。
- 获取目录服务器软件,如之前讨论过的。
- 配置目录服务器以使用所需的模式。在本教程中使用的示例需要在服务器上配置一个特殊的 schema。
- 使用所需的内容填充目录服务器。在本教程中使用的示例需要在服务器上填充一个特殊的内容。
- 编写一个 JNDI 应用程序来访问目录,编译并运行它以获得您想要的结果。JNDI 示例将在下一个课程中介绍。
前两个步骤在前一部分中已经涵盖。本课程的其余部分讨论了第三步和第四步的一部分。涉及编写 JNDI 应用程序的第五步在下一课程中介绍,展示如何编写 JNDI 应用程序来执行目录上的各种操作。
一旦您设置了目录,或者已经指示您的程序与现有目录通信,您可以在那里找到什么样的信息?
目录可以被视为由名称到对象绑定组成。也就是说,目录中的每个对象都有一个对应的名称。您可以通过查找其名称来检索目录中的对象。
目录中还存储着属性。目录中的对象除了有一个名称外,还有一组可选的属性。您可以向目录查询对象的属性,也可以要求它搜索具有特定属性的对象。
步骤 3:目录模式
模式指定目录可能包含的对象类型。本教程使用条目填充目录,其中一些条目需要特殊的模式定义。为了容纳这些条目,您必须首先在服务器中关闭模式检查,或者将附带本教程的模式文件添加到服务器中。这两项任务通常由目录服务器的管理员执行。
本教程附带两个必须安装的模式文件:
Java 对象的模式CORBA 对象的模式
这些文件的格式是一种可能不能直接复制粘贴到服务器配置文件中的正式描述。具体来说,属性语法是根据RFC 2252描述的。
不同的目录服务器有不同的配置模式方式。本教程包括一些工具,用于在允许通过 LDAP 修改其模式的目录服务器上安装 Java 和 CORBA 模式。以下是工具可以执行的任务列表。
创建 Java 模式创建 CORBA 模式
按照随附的README 文件中的说明运行这些程序。
注意:Windows 活动目录。 Active Directory 通过使用内部格式管理其模式。要更新模式,您可以使用 Active Directory 管理控制台插件ADSIEdit或CreateJavaSchema实用程序,按照 Active Directory 的说明进行操作。
第 4 步:为本教程提供目录内容
在本教程的示例中,显示的结果反映了使用随附本教程的配置文件(tutorial.ldif)设置 LDAP 目录的方式。如果您正在使用现有服务器或具有不同设置的服务器,则可能会看到不同的结果。在将配置文件(tutorial.ldif)加载到目录服务器之前,您必须按照更新服务器模式的说明进行操作,或者如果您的 UNIX 系统上有ldapadd或ldapmodify命令,则可以使用它们。
例如,使用 ldapmodify,您可以执行以下操作(通过为主机名、管理员 DN(-D 选项)和密码插入适当的值):
ldapmodify -a -c -v -h hostname -p 389\ -D "cn=Administrator, cn=users, dc=xxx, dc=xxx"\ -w passwd -f tutorial.ldif
安装注意事项:访问控制。 不同的目录服务器以不同方式处理访问控制。本教程中的一些示例执行对目录的更新。此外,您安装教程的命名空间部分可能具有读取访问限制。因此,您需要采取特定于服务器的操作,使目录可读和/或可更新,以使这些示例正常工作。对于Oracle 目录服务器,请将sunds.aci.ldif文件中建议的aci条目添加到dn: o=JNDITutorial条目中,以使整个目录可读和可更新。或者,您可以更改示例以对目录进行身份验证。如何执行此操作的详细信息在安全课程中有描述。
安装注意事项:命名空间设置。 tutorial.ldif 文件中的条目使用了"o=JNDITutorial"作为根命名上下文的区分名称(DN)。如果您尚未将目录服务器配置为具有"o=JNDITutorial"作为根命名上下文,则导入tutorial.ldif的尝试将失败。解决此问题的最简单方法是将现有根命名上下文的 DN 添加到tutorial.ldif文件中的每个"dn:“行中。例如,如果您的服务器已经具有根命名上下文"dc=imc,dc=org”,则应更改该行
dn: o=JNDITutorial
到
dn: o=JNDITutorial, dc=imc, dc=org
对文件中以"dn:“开头的每一行进行更改。然后,在本教程的所有示例中,无论何时使用"o=JNDITutorial”,请改用"o=JNDITutorial,dc=imc,dc=org"。
**安装说明:文件格式。**根据您使用的操作系统平台,您可能需要编辑tutorial.ldif,以便其中包含该平台的正确换行符。例如,如果您发现tutorial.ldif包含 Windows 风格的换行符(CRLF),而您要将此文件导入运行在 UNIX 平台上的目录服务器,则需要编辑文件并将 CRLF 替换为 LF。此问题的症状是目录服务器拒绝tutorial.ldif中的所有条目。
安装说明:Windows Active Directory。
- 根命名上下文不会是“o=jnditutorial”。它将采用“dc=x,dc=y,dc=z”的形式。您需要遵循之前的命名空间设置说明。
- 通过使用 Active Directory 管理控制台插件
ADSIEdit,为“inetOrgPerson”和“groupOfUniqueNames”对象类添加对象类和相关属性到 Active Directory 模式中。"groupOfUniqueNames"在RFC 2256中定义,"inetOrgPerson"在RFC 2798中定义。 - 教程中使用的一些层次关系在 Active Directory 中默认情况下是不允许的。要启用这些关系,请使用 Active Directory 管理控制台插件
ADSIEdit添加它们。
objectclass: organizationalUnit possible superiors: domainDNS inetOrgPerson organization organizationalPerson organizationalUnit person top objectclass: groupOfUniqueNames possible superiors: top objectclass: inetOrgPerson possible superiors: container organizationalPerson person top
- 从
tutorial.ldif中的马克·吐温条目中删除两个“sn”属性中的一个。Active Directory 将“sn”定义为单值属性,与RFC 2256相悖。 - 使用
ldifde命令行实用程序加载修改后的tutorial.ldif文件。
# ldifde -i -v -k -f tutorial.ldif
- 大多数示例假定目录已设置为允许未经身份验证的读取和更新访问。您的 Active Directory 设置可能不允许您这样做。请参阅访问控制安装说明。
- 有时读取条目会产生比教程中显示的更多属性,因为 Active Directory 通常会返回一些内部属性。
- 创建条目可能需要指定其他 Active Directory 特定属性或使用其他对象类。
Java 应用程序设置
原文:
docs.oracle.com/javase/tutorial/jndi/software/package.html
要在程序中使用 JNDI,您需要设置其编译和执行环境。
导入 JNDI 类
以下是 JNDI 包:
本教程中的示例使用来自前两个包的类和接口。您需要将这两个包导入到您的程序中,或者导入您使用的单个类和接口。以下两行导入了两个包javax.naming和javax.naming.directory中的所有类和接口。
import javax.naming.*; import javax.naming.directory.*;
编译环境
要编译使用 JNDI 的程序,您需要访问 JNDI 类。 Java SE 6 已经包含了 JNDI 类,因此如果您正在使用它,您无需采取进一步的操作。
执行环境
要运行使用 JNDI 的程序,您需要访问 JNDI 类和程序使用的任何服务提供商的类。 Java Runtime Environment(JRE)6 已经包含了 LDAP、COS 命名、RMI 注册表和 DNS 的 JNDI 类和服务提供商。
如果您正在使用其他服务提供商,则需要下载并安装它们的存档文件到JAVA_HOME/jre/lib/ext目录中,其中JAVA_HOME是包含 JRE 的目录。 JNDI 页面列出了一些服务提供商。您可以下载这些提供商或使用其他供应商的提供商。
课程:命名和目录操作
您可以使用 JNDI 执行命名操作,包括读取操作和更新命名空间的操作。本课程中描述了以下操作:
- 查找对象
- 列出上下文的内容
- 添加、覆盖和删除绑定
- 重命名对象
- 创建和销毁子上下文
配置
在执行任何命名或目录服务操作之前,您需要获取一个初始上下文–进入命名空间的起始点。这是因为所有命名和目录服务上的方法都是相对于某个上下文执行的。要获取初始上下文,您必须按照以下步骤进行。
- 选择要访问的相应服务的服务提供者。
- 指定初始上下文需要的任何配置。
- 调用
InitialContext构造函数。
步骤 1:选择初始上下文的服务提供者
您可以通过创建一组环境属性(Hashtable)并将服务提供者类的名称添加到其中来指定初始上下文要使用的服务提供者。环境属性在JNDI 教程中有详细描述。
如果您正在使用 JDK 中包含的 LDAP 服务提供者,则您的代码将如下所示。
Hashtable<String, Object> env = new Hashtable<String, Object>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
要在 JDK 中指定文件系统服务提供者,您需要编写类似以下代码的代码。
Hashtable<String, Object> env = new Hashtable>String, Object>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
您还可以使用系统属性来指定要使用的服务提供者。查看JNDI 教程获取详细信息。
步骤 2:提供初始上下文所需的信息
不同目录的客户端可能需要各种信息来联系目录。例如,您可能需要指定服务器在哪台机器上运行以及需要什么信息来识别用户到目录。此类信息通过环境属性传递给服务提供者。JNDI 指定了一些通用的环境属性,服务提供者可以使用。您的服务提供者文档将详细说明这些属性所需的信息。
LDAP 提供程序要求程序指定 LDAP 服务器的位置,以及用户身份信息。为了提供这些信息,您需要编写如下代码。
env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389"); env.put(Context.SECURITY_PRINCIPAL, "joeuser"); env.put(Context.SECURITY_CREDENTIALS, "joepassword");
本教程使用 JDK 中的 LDAP 服务提供程序。示例假设在本地机器上的端口 389 上设置了一个服务器,根专有名称为"o=JNDITutorial",并且更新目录不需要认证。它们包括以下代码来设置环境。
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
如果你正在使用设置不同的目录,那么你需要相应地设置这些环境属性。你需要将"localhost"替换为那台机器的名称。你可以运行这些示例代码来访问任何公共目录服务器或者运行在不同机器上的你自己的服务器。你需要将"localhost"替换为那台机器的名称,并将o=JNDITutorial替换为可用的命名上下文。
第三步:创建初始上下文
现在你已经准备好创建初始上下文了。为此,你需要将之前创建的环境属性传递给InitialContext构造函数:
Context ctx = new InitialContext(env);
现在你已经有了一个指向Context对象的引用,你可以开始访问命名服务。
要执行目录操作,你需要使用一个InitialDirContext。为此,使用其中的一个构造函数:
DirContext ctx = new InitialDirContext(env);
这个语句返回一个用于执行目录操作的DirContext对象的引用。