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

我使用在一台服务器上运行的开放 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。

幕布斯7119047
浏览 164回答 2
2回答

SMILET

经过调试很多事情后得到了这个问题的答案。因为我在整个应用程序中只创建一次连接。它在 IP 上的同一子网中工作,因为中间没有防火墙。但是,当它移动到不同的子网时,由于连接关闭而出现此错误,因为防火墙关闭了代表较长时间的连接。为了解决这个问题,我在需要时创建一个连接请求,并池化相同的连接,这样,如果下一个请求到来,如果连接在连接池中可用,则使用相同的连接,否则创建新连接并在完成工作后关闭相同的连接。:)

互换的青春

不知道异常,错误的一件事是您没有调用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;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java