2013-10-03 173 views
2

我有一个网页来管理活动目录组,并且在此页面的初始化过程中,我使用jndi连接到ldap并将ldap上下文保存在http会话中。获取连接重置在会话中存储/检索InitialLdapContext时出现异常

下面是如何连接到LDAP:

public static LdapContext connectToLdap(String host, 
      String userDN, String userPassword, 
      boolean ssl) throws Exception { 

     System.out.println("connectToLdap"); 

     String hostPrefix = "ldap"; 
     String ldapPort = "389"; 
     if (ssl) { 
      hostPrefix = "ldaps"; 
      ldapPort = "636"; 
     } 
     String providerUrl = hostPrefix + "://" + host + ":" + ldapPort; 
     //System.out.println("####### LDAP URL: " + providerUrl); 
     LdapContext ldapContext; 
     Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11); 
     ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.ldap.LdapCtxFactory"); 
     ldapEnv.put(Context.PROVIDER_URL, providerUrl); 
     ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     ldapEnv.put(Context.SECURITY_PRINCIPAL, userDN); 
     ldapEnv.put(Context.SECURITY_CREDENTIALS, userPassword); 
     ldapEnv.put("com.sun.jndi.ldap.read.timeout", 1000 * 10 + ""); 
     if (ssl) { 
      ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl"); 
     } 
     ldapEnv.put(Context.REFERRAL, "ignore"); 
     try { 
      ldapContext = new InitialLdapContext(ldapEnv, null);   
      System.out.println("success connection to ldap"); 
      return ldapContext; 
     } catch (Exception e) { 
      System.out.println("failure connection to ldap"); 
      e.printStackTrace(); 
      return null; 
     } 
    } 
  • 我不关闭的背景下,因为它将用户会话中被重新使用。
  • 我在会话中放置了ldapcontext,这样我就不必频繁地调整每个用户的ldap,每个用户每个会话只有一个连接。

问题:我注意到,有时10-15分钟后Active Directory组的检索失败,我得到异常:

javax.naming.CommunicationException: Connection reset [Root exception is java.net.SocketException: Connection reset] 

任何想法,为什么?请告诉我为什么我得到这个问题以及如何解决它。

+0

检查LDAP服务器日志。将有一些问题,因为服务器正在重置连接。 – Santosh

回答

1

不要将LdapContext放在HTTP会话中,它不会实现Serializable接口,所以不能保证它可以存储/恢复到会话中。

想一想,如果会话被存储在数据库中或者被复制到另一个服务器上,LdapContext将被转换为字节,以及它引用的任何套接字描述符,当从字节恢复它们时它将如何工作?

了在一个单身,如果你需要长期连接。

除此之外,服务器和网络设备通常会关闭[他们认为的]非活动的网络连接,因此任何长期连接都需要进行测试或保持活动状态。

如果仍然相关,我会建议你使用(GPL第二版,LGPLv2.1行货)UnboundID LDAP SDK for Java(没有隶属关系),用于处理connectionpoolingconnection testing有点比运JNDI实现更好的。

相关问题