# LDAP 比较

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

LDAP“比较”操作允许客户端询问服务器命名条目是否具有属性/值对。这允许服务器保持某些属性/值对是秘密的（即，不暴露用于一般的“搜索”访问），同时仍然允许客户端有限地使用它们。例如，某些服务器可能会将此功能用于密码，但客户端在“比较”操作本身中传递明文密码是不安全的。

要在 JNDI 中完成此操作，请对以下方法使用适当约束的参数：

*   [`搜索（名称，字符串过滤器，SearchControls ctls）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#search-javax.naming.Name-java.lang.String-javax.naming.directory.SearchControls-)
*   [`搜索（名称名称，String filterExpr，Object [] filterArgs，SearchControls ctls）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html#search-javax.naming.Name-java.lang.String-java.lang.Object:A-javax.naming.directory.SearchControls-)

1.  过滤器必须是“（_ 名称 _ = _ 值 _）”的形式。你不能使用外卡。
2.  搜索范围必须是 [`SearchControls.OBJECT_SCOPE`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/SearchControls.html#OBJECT_SCOPE)。
3.  您必须请求不返回任何属性。如果不满足这些条件，则这些方法将使用 LDAP“搜索”操作而不是 LDAP“比较”操作。

这是 [`an example`](examples/Compare.java) 导致使用 LDAP“比较”操作。

```
// Value of the attribute
byte[] key = {(byte)0x61, (byte)0x62, (byte)0x63, (byte)0x64, 
              (byte)0x65, (byte)0x66, (byte)0x67};

// Set up the search controls
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(new String[0]);       // Return no attrs
ctls.setSearchScope(SearchControls.OBJECT_SCOPE); // Search object only

// Invoke search method that will use the LDAP "compare" operation
NamingEnumeration answer = ctx.search("cn=S. User, ou=NewHires", 
                                      "(mySpecialKey={0})", 
                                       new Object[]{key}, ctls);

```

如果比较成功，则生成的枚举将包含一个名称为空名称且不包含任何属性的项目。