我使用在一台服务器上运行的开放 LDAP,它在 10.0.26.X IP 上运行,我的客户端在 IP 10.0.25.X 上运行,中间有防火墙,但端口 389 已打开并处于侦听状态。因此,我面临的客户端问题是它关闭了客户端服务器,之后我必须每 6 小时重新启动一次客户端,然后它工作一段时间后会再次出现同样的问题。我尝试打开客户端和打开 LDAP 之间的连接,但出现同样的问题。同样从防火墙端我们已经尝试了一切。Hashtable<String, String> envMap = new Hashtable<>(); envMap.put(Context.INITIAL_CONTEXT_FACTORY, initContextFactory); envMap.put(Context.PROVIDER_URL, providerUrl); envMap.put(Context.SECURITY_AUTHENTICATION, securityAuthentication); envMap.put(Context.SECURITY_PRINCIPAL, userDN); envMap.put(Context.SECURITY_CREDENTIALS, password); DirContext userCtx = new InitialDirContext(envMap);SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.SUBTREE_SCOPE); String filter = MessageFormat.format(Constants.LDAP_PERSON_FILTER, attrKey, attrValue); NamingEnumeration<SearchResult> userResults = dirReaderctx.search(Constants.LDAP_DOMAIN_NAME, filter, controls); if (userResults.hasMore()) { searchResult = userResults.next(); return searchResult; }我得到的例外是:[com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:2002)、com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844)、com.sun.jndi.ldap.LdapCtx.c_search (LdapCtx.java:1769),com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:392),com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:358), com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:341), javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267), sun.reflect.GenerateMethodAccessor100.invoke(未知来源), sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43), java.lang.reflect.Method.invoke(Method.java:498), org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java: 209),org.springframework.web.method。
2 回答
SMILET
TA贡献1796条经验 获得超4个赞
经过调试很多事情后得到了这个问题的答案。因为我在整个应用程序中只创建一次连接。它在 IP 上的同一子网中工作,因为中间没有防火墙。但是,当它移动到不同的子网时,由于连接关闭而出现此错误,因为防火墙关闭了代表较长时间的连接。为了解决这个问题,我在需要时创建一个连接请求,并池化相同的连接,这样,如果下一个请求到来,如果连接在连接池中可用,则使用相同的连接,否则创建新连接并在完成工作后关闭相同的连接。:)
互换的青春
TA贡献1797条经验 获得超6个赞
不知道异常,错误的一件事是您没有调用close()
上的方法NamingEnumeration
,因此您正在泄漏资源。
如果它工作了一段时间,然后停止工作,这很可能是您遇到的资源耗尽异常。
NamingEnumeration<SearchResult> userResults = dirReaderctx.search(Constants.LDAP_DOMAIN_NAME,
filter, controls);
if (userResults.hasMore()) {
searchResult = userResults.next();
userResults.close(); // <-- add this line
return searchResult;
}
添加回答
举报
0/150
提交
取消