首页 > 解决方案 > 将用户搜索到 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.GeneratedMethodAccessor100.invoke(Unknown Source), 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。support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136), org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102), org.springframework.web.servlet.mvc.method. annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877),org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783),org.springframework.web.servlet.mvc.method。 AbstractHandlerMethodAdater.handle(AbstractHandlerMethodAdapter.java:87), org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991), org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925), org .springframework.web.servlet.FrameworkServlet。processRequest(FrameworkServlet.java:974), org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877), javax.servlet.http.HttpServlet.service(HttpServlet.java:661), org.springframework.web .servlet.FrameworkServlet.service(FrameworkServlet.java:851), javax.servlet.http.HttpServlet.service(HttpServlet.java:742), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166), org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52), org.apache.catalina.core.ApplicationFilterChain。 internalDoFilter(ApplicationFilterChain.java:193)、org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)、org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter。doFilterInternal(HttpTraceFilter.java:90), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107), org.apache.catalina.core.ApplicationFilterChain.inernalDoFilter(ApplicationFilterChain.java:193), org.apache .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166), org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java :193), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166), org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99), org.springframework.web.filter。 OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107),org.apache.catalina.core.ApplicationFilterChain。internalDoFilter(ApplicationFilterChain.java:193),org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96), org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493), org.apache .catalina.core.StandardHostValve.invoke(StandardHostValve.java:140), org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81), org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java :87)、org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)、org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)、org.apache.coyote.AbstractProcessorLight。进程(AbstractProcessorLight.java:66),org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800),org.apache.tomcat.utit.util.net.NioEndpoint$SocketProcessor。doRun(NioEndpoint.java:1471), org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149), java.util .concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624), org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61), java.lang.Thread.run(Thread.java :748)]

标签: javaspringldapopenldap

解决方案


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


推荐阅读