为了账号安全,请及时绑定邮箱和手机立即绑定

在 LDAP 中搜索用户时出现问题

在 LDAP 中搜索用户时出现问题

幕布斯7119047 2023-08-16 16:36:39
我使用在一台服务器上运行的开放 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 上的同一子网中工作,因为中间没有防火墙。但是,当它移动到不同的子网时,由于连接关闭而出现此错误,因为防火墙关闭了代表较长时间的连接。为了解决这个问题,我在需要时创建一个连接请求,并池化相同的连接,这样,如果下一个请求到来,如果连接在连接池中可用,则使用相同的连接,否则创建新连接并在完成工作后关闭相同的连接。:)



查看完整回答
反对 回复 2023-08-16
?
互换的青春

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;

}


查看完整回答
反对 回复 2023-08-16
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信