Java 以编程方式连接到AD时出现问题

Java 以编程方式连接到AD时出现问题,java,active-directory,Java,Active Directory,我正在开发一个JavaEE6应用程序,它使用AD来帮助登录。我的验证器很简单,如下所示: @Singleton @TransactionManagement(TransactionManagementType.BEAN) public class ADAuthenticator{ private static final String ldapHost = "ldap://domainname.mycompany.com:389"; private static final St

我正在开发一个JavaEE6应用程序,它使用AD来帮助登录。我的验证器很简单,如下所示:

@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class ADAuthenticator{
    private static final String ldapHost = "ldap://domainname.mycompany.com:389";
    private static final String domain = "domainname";

    public ADAuthenticator() {
    }

    public void authenticate(String user, String pass) throws NamingException{
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldapHost);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, user + "@" + domain);
        env.put(Context.SECURITY_CREDENTIALS, pass);
        LdapContext ctxGC = new InitialLdapContext(env, null);
    }
}
这已经很好地工作了一段时间,但最近我得到了以下例外(除了一些神奇的工作时间):

javax.naming.CommunicationException:mydomain.mycompany.com:389[根异常为java.net.ConnectException:连接超时:连接]
位于com.sun.jndi.ldap.Connection(Connection.java:210)
位于com.sun.jndi.ldap.LdapClient.(LdapClient.java:118)
位于com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1580)
位于com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2652)
位于com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:293)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
位于com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
位于com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
位于javax.naming.InitialContext.init(InitialContext.java:223)
位于javax.naming.ldap.InitialLdapContext。(InitialLdapContext.java:134)
在com.xdin.competency.util.ADAuthenticator.authenticate上(ADAuthenticator.java:35)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在
原因:java.net.ConnectException:连接超时:连接
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
位于java.net.socksocketimpl.connect(socksocketimpl.java:366)
位于java.net.Socket.connect(Socket.java:529)
位于java.net.Socket.connect(Socket.java:478)
位于java.net.Socket(Socket.java:375)
位于java.net.Socket(Socket.java:189)
在com.sun.jndi.ldap.Connection.createSocket(Connection.java:352)上
位于com.sun.jndi.ldap.Connection(Connection.java:187)
... 还有101个
代码没有任何变化,根据IT支持,关于AD的配置也没有变化


我将相关代码分离到一个简单的控制台应用程序中,它可以完美地使用完全相同的设置。因此,问题似乎与JavaEE或Web服务器有关。有什么想法吗?

TCP/IP连接的数据包没有及时到达。这可能有多种原因,但从您描述的情况来看,这可能只是Java代码和LDAP服务器之间的网络拥塞,而这又会导致包丢失。也可能有一个防火墙阻止中间的端口


您需要了解
ping
traceroute
telnet主机端口
工具,以便对网络层进行故障排除。我建议您与IT支持部门的一名网络人员合作,友好地请他帮忙找出您的包裹丢失的地方。

+1。这具有网络问题的所有特征。另外,不要忘记检查服务器(和广告)上的NIC(网卡)。这是人们通常认为永远不会发生的事情之一,但令人惊讶的是,NIC:s的中断频率如此之高。最简单的检查方法是尝试在另一台物理机器上运行你的应用程序,或者临时添加一个新的NIC(你可以免费获得一个便宜的以太网卡OTC)。尝试将广告部分从我的项目中分离到SE应用程序中,它工作得非常完美。所以我想我可以排除任何硬件问题。看起来Java EE/webserver存在一些问题stuff@Rasmus,取决于SE应用程序运行的位置。@Thorbjørn Ravn Andersen我面临同样的问题,我可以ping服务器的机器。是否有办法从我的本地计算机跟踪包,以查看它是否到达服务器(即使我认为响应为否)@aName Yes。根据您的平台,您应该具有可用(或可安装)的“tracert”或“traceroute”。这将帮助您对网络连接进行故障排除。
javax.naming.CommunicationException: mydomain.mycompany.com:389 [Root exception is java.net.ConnectException: Connection timed out: connect]
at com.sun.jndi.ldap.Connection.<init>(Connection.java:210)
at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:118)
at com.sun.jndi.ldap.LdapClient.getInstance(LdapClient.java:1580)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2652)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134)
at com.xdin.competence.util.ADAuthenticator.authenticate(ADAuthenticator.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at <ejb stuff omitted> 

Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at com.sun.jndi.ldap.Connection.createSocket(Connection.java:352)
at com.sun.jndi.ldap.Connection.<init>(Connection.java:187)
... 101 more