# 管理推荐控制

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/newstuff/mdsaIT.html](https://docs.oracle.com/javase/tutorial/jndi/newstuff/mdsaIT.html)

管理引用控件（ [RFC 3296](http://www.ietf.org/rfc/rfc3296.txt) ）允许在执行 LDAP 操作时将引用和其他特殊对象操作为普通对象。换句话说，管理引用控制告诉 LDAP 服务器将引用条目作为普通条目返回，而不是返回“引用”错误响应或继续引用。下面的 JDK 5.0 中的新类使您可以发送管理引用控制以及 LDAP 请求：

[`javax.naming.ldap.ManageReferralControl`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/ManageReferralControl.html)

JDK 中的 LDAP 服务提供程序将自动发送此控件以及任何请求。您还可以显式启用它将 Context.REFERRAL 环境属性设置为“ignore”。有关引用处理的更多信息，请查看 JNDI 教程的 JNDI 部分中的[引用。](https://docs.oracle.com/javase/jndi/tutorial/ldap/referral/jndi.html)

以下是一个发送 Manage Referral 控件和 LDAP 请求的示例。

```
         // Create initial context
         LdapContext ctx = (LdapContext) new InitialDirContext(env);
         ctx.setRequestControl(new Control[] new ManageReferralControl());

         // Set controls for performing subtree search
         SearchControls ctls = new SearchControls();
         ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);

         // Perform search
         NamingEnumeration answer = ctx.search("", "(objectclass=*)", ctls);

         // Print the answer
         while (answer.hasMore()) {
             System.out.println(">>>" + 
                 ((SearchResult)answer.next()).getName());
          }

          // Close the context when we're done
          ctx.close();

```

完整的例子可以找到 [`here`](examples/ManageReferral.java) 。

* * *

**注 1：**以上示例将要求您使用配置文件 [`refserver.ldif`](../software/config/refserver.ldif) 设置第二台服务器。服务器必须支持 LDAP v3 和 RFC 3296.如果服务器不支持这种方式的引用，则示例将不会如图所示。配置文件包含指向您已设置的原始服务器的引用。它假定原始服务器位于本地计算机上的端口 389 上。如果您已在另一台计算机或端口上设置服务器，则需要编辑 refserver.ldif 文件中的“ref”条目，并将“localhost：389”替换为相应的设置。第二台服务器将在本地计算机上的端口 489 上设置。如果在另一台计算机或端口上设置第二台服务器，则需要相应地调整 Context.PROVIDER_URL 环境属性的设置。

设置目录服务器通常由目录或系统管理员执行。有关详细信息，请参阅[软件设置](../software/index.html)课程。

**注意 2：** Windows Active Directory：由于 Active Directory 不支持“管理引用”控件，因此本课程中的所有示例都不适用于 Active Directory。

* * *