如何在进行身份验证之前检查当前 LDAP 服务器是启动还是关闭

How to check whether current LDAP server is up or down before doing an authentication

我想在进行身份验证之前检查当前的 LDAP 服务器是启动还是关闭。我正在使用 UnboundID LDAP SDK。有什么办法可以做到这一点吗?

有一个方法isConnected():

public boolean isConnected()
Indicates whether this connection is currently established.
Returns:
true if this connection is currently established, or false if it is not.

所以一个简单的例子是这样的:

LDAPConnection ldc = new LDAPConnection()
ldc.connect(...);
if (ldc.isConnected())
{
   do good stuff
}
else
{
   getLDAPConnection(...);
}

应该可以解决问题。

测试任何资源是否可用的最佳方法就是尝试在应用程序的正常过程中使用它,并在出现错误时处理它们。

否则你就是在预测未来。

我们可以使用 SSUtil 来做到这一点。这里不需要经过身份验证的条目,我们可以在进行任何身份验证之前检查服务器是启动还是关闭。

SSLUtil su = new SSLUtil(new TrustAllTrustManager());
SSLSocketFactory sf = su.createSSLSocketFactory();
LDAPConnection connection = new LDAPConnection(sf,"localhost", 10636);

寻找此解决方案的优缺点。

检查端口是否正常运行。这是纯粹的 Java。无需 SSL 工厂或 SSL 上下文或凭证。如果包被防火墙丢弃,则以毫秒为单位超时。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public static boolean isPortReachable(String host, int port, int timeOutMS) {
    try (Socket serverSocket = new Socket();) {
        serverSocket.connect(new InetSocketAddress(host, port), timeOutMS);
        return true;    
    } catch (final IOException e) { /* Ignore, Port not reachable */ }
    return false;
}

LDAP 或 LDAPS 的用法:

if (isPortReachable(hostname, 389, 200)) { ... }

if (isPortReachable(hostname, 636, 200)) { ... }