Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试到多个LDAP服务器的连接时出错_Java_Active Directory_Ldap_Wildfly - Fatal编程技术网

Java 测试到多个LDAP服务器的连接时出错

Java 测试到多个LDAP服务器的连接时出错,java,active-directory,ldap,wildfly,Java,Active Directory,Ldap,Wildfly,我正在开发一个java web应用程序,它需要连接到Active Directory服务器(LDAP),以便对一些用户进行身份验证。它工作正常,但我正在尝试将其配置为能够连接到两个不同的服务器。所以我在我的属性中加入了以下语法: env.put(Context.PROVIDER_URL, "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL") + ":636 " + "LDAP://" +

我正在开发一个java web应用程序,它需要连接到Active Directory服务器(LDAP),以便对一些用户进行身份验证。它工作正常,但我正在尝试将其配置为能够连接到两个不同的服务器。所以我在我的属性中加入了以下语法:

env.put(Context.PROVIDER_URL, 
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL") + ":636 " +
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL2") + ":636" 
        );
System.out.println(env.get(Context.PROVIDER_URL));
// it prints LDAP://psfjfhsj.com.br:636 LDAP://myRealLdap.com.br:636
这就是两个空格分隔的ldap URL。第一个不是真实地址,第二个是我的ldap服务器。但是我的连接尝试失败了,因为我的应用程序找不到第一台服务器!以下是一些控制台输出:

javax.naming.CommunicationException: psfjfhsj.com.br:636 [Root exception is java.net.UnknownHostException: psfjfhsj.com.br]
 at com.sun.jndi.ldap.Connection.<init>(Connection.java:226)
 (...)
Caused by: java.net.UnknownHostException: psfjfhsj.com.br
javax.naming.CommunicationException:psfjfhsj.com.br:636[根异常为java.net.UnknownHostException:psfjfhsj.com.br]
位于com.sun.jndi.ldap.Connection(Connection.java:226)
(...)
原因:java.net.UnknownHostException:psfjfhsj.com.br
我正在调试ssl连接(在我的服务器中使用
-Djavax.net.debug=ssl
标志),我可以看到我的真实主机(
myrealdap.com.br
)连接和握手正常。当然找不到假URL,但这不是“服务器关闭”的真实模拟吗

我使用的是带有
openjdk1.8.0_242
wildfly9.0.2
服务器

谢谢

根据您实现的代码,您应该支持这一点:

您还可以提供一个以空格分隔的URL列表,而不仅仅是一个URL 网址。在这种情况下,LDAP提供程序将尝试使用中的每个URL 打开,直到能够创建成功的连接。LDAP 提供者然后将Context.provider\u URL属性设置为 成功的URL,以便应用程序可以确定哪个URL是 正在使用中

根据您的堆栈跟踪,我们有
UnknownHostException
,在中,它表示抛出它是为了指示无法确定主机的IP地址。基本上,此错误是为DNS未命中而引发的

深入查看internet,我发现其他人的问题与您的问题非常接近(LDAP连接时出现相同错误(,和)。 通过更新DNS以包含未知的主机名,所有这些问题都得到了解决

这将导致我对Oracle文档的解释。 当他们说,LDAP提供商将尝试依次使用每个URL,直到它能够创建成功的连接。他们的意思是,连接可能会被拒绝,因为服务器已关闭,而不是因为它不存在。

根据您实现的代码,应该支持这一点:

您还可以提供一个以空格分隔的URL列表,而不仅仅是一个URL 在这种情况下,LDAP提供程序将尝试在中使用每个URL 打开,直到能够创建成功的连接 提供者然后将Context.provider\u URL属性设置为 成功的URL,以便应用程序可以确定哪个URL是 正在使用中

根据您的堆栈跟踪,我们有
UnknownHostException
,在中,它表示抛出它是为了指示无法确定主机的IP地址。基本上,此错误是为DNS未命中而抛出的

深入查看internet,我发现其他人的问题与您的问题非常接近(LDAP连接时出现相同错误(,和)。 通过更新DNS以包含未知的主机名,所有这些问题都得到了解决

这将导致我对Oracle文档的解释。
当他们说,LDAP提供商将尝试依次使用每个URL,直到它能够创建成功的连接。他们的意思是,连接可能会被拒绝,因为服务器已关闭,而不是因为它不存在。

您更有可能无法访问目标主机或连接被拒绝。您确定这是正确的方法吗要列出多个服务器吗?我觉得这也很有趣,但似乎是正确的方法。下面是一些链接,说明了这一点:您是否尝试使用以下命令?//创建初始上下文DirContext ctx=new InitialDirContext(env);//查看使用了哪个服务器System.out.println(ctx.getEnvironment().get(context.PROVIDER\u URL));?如果我使用
realHost1.com realHost2.com
,打印只显示第一个的地址。如果我使用
fakeHost.com realHost2.com
,它只打印真实主机的URL,尽管它是列表中的第二个URL,并给我通信异常。我想这是openjdk的问题(可能没有实现?)。我在openjdk文档中找不到对此多url选项的任何引用。您是否可以尝试使用oracle更改JDK,因为@BrunoLamps发布的链接对此有支持?您更有可能无法访问目标主机或连接被拒绝。您确定这是列出多个服务器的正确方法吗?我想d这也很有趣,但似乎是正确的方法。以下是一些链接说明了这一点:您是否尝试使用以下命令?//创建初始上下文DirContext ctx=new InitialDirContext(env);//查看使用了哪个服务器System.out.println(ctx.getEnvironment().get(context.PROVIDER\u URL));?如果我使用
realHost1.com realHost2.com
,打印只显示第一个的地址。如果我使用
fakeHost.com realHost2.com
,它只打印真实主机的URL,尽管它是列表中的第二个URL,并给我通信异常。我想这是openjdk的问题(可能没有实现?)。我在openjdk文档中找不到任何关于此多url选项的引用。您可以更改JDK并尝试使用oracle,因为根据@BrunoLamps发布的链接,在这方面有支持吗?最后一分钟的想法:您可以检查是否支持IP而不是主机名,这样您就可以跳过DNS问题。我想我将使用existe进行测试nt但离线网络主机,谢谢@rakwaht!嗨,我刚刚尝试了一个存在的主机,它在我们的dns中注册,但已关闭。我得到了一个“javax.naming.CommunicationException:xxxxxxx.xxx.gov.br:636[根异常是java.net.NoRo