4

我们有多个 LDAP/域服务器。(例如LDAP://server1.com:389/DC=server1,DC=COMLDAP://server2.com:389/DC=server2,DC=COM)我需要通过检查可用性来使用其中一个。

try {
    Hashtable<String, String> env = new Hashtable<String, String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "LDAP://server1.com:389/DC=server1,DC=COM");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, username);
    env.put(Context.SECURITY_CREDENTIALS, password);

    DirContext ctx = new InitialDirContext(env);
} catch(NamingException ex) {
}
4

2 回答 2

8

您可以在 PROVIDER_URL 环境属性中使用多个 ldap 服务器 URL,如下所示:

Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");

// Specify list of space-separated URLs
env.put(Context.PROVIDER_URL, 
    "ldap://notthere:389/o=JNDITutorial " +
    "ldap://localhost:389/o=JNDITutorial " + 
    "ldap://remotehost/o=JNDITutorial " +
    "ldap://thirdhost:389/o=JNDITutorial");

// Create initial context
DirContext ctx = new InitialDirContext(env);

// See which server was used
System.out.println(ctx.getEnvironment().get(Context.PROVIDER_URL));

// do something useful with ctx
....

无论哪个 URL 成功,都会在上下文中使用

于 2018-04-06T07:19:30.633 回答
2

您可以执行简单的匿名搜索以查看 LDAP 服务器是否已启动并正在运行。如果您收到拒绝连接异常,则服务器将关闭,您可以切换到列表中的下一个,再次执行相同的操作。

通常有一串域控制器前面会有负载均衡器,请求被路由到负载均衡器,该负载均衡器将识别正确的 DC 并将请求代理给它。LB 负责定期检查其列表中 DC 的可用性,如果它们出现故障则将其删除,当它们打开时再次检查它们等等。您可能需要与您的 IT 部门核实您的环境中是否存在此类 LB。

于 2013-01-22T13:17:06.467 回答