我在使用LDAP服务器进行身份验证时,Apache Tomcat的行为方式存在问题。
当我第一次尝试登录时,一切都很好。如果我将连接空闲一段时间,然后只是注销(出于测试目的)并重新登录,它会抛出下面提到的异常,但是成功登录。为什么会这样?
请注意,如果我在未注销的情况下继续使用该应用程序,则不会发生这种情况。
这是我的服务器配置
Server version: Apache Tomcat/8.0.24
Server built: Jul 1 2015 20:19:55 UTC
Server number: 8.0.24.0
OS Name: Linux
OS Version: 2.6.18-238.el5
Architecture: amd64
JVM Version: 1.7.0_67-b01
JVM Vendor: Oracle Corporation
以下是具有异常跟踪的控制台输出。由于我退出,前两行是输出,然后当我尝试重新登录时创建异常(最终成功)
2015-08-18 15:47:14.493 DEBUG 28842 --- [io-8180-exec-10] c.c.c.a.c.BaseAceConsoleApplication : Cleared cookie JSESSIONID, value= 1157DD8C066BBC384E7C2BAD380476A8
2015-08-18 15:47:14.494 DEBUG 28842 --- [io-8180-exec-10] c.c.c.a.c.BaseAceConsoleApplication : Cleared cookie JSESSIONIDSSO, value= 3800C322B28A40CB74A5CDBC3AAD46C5
18-Aug-2015 15:47:18.780 INFO [http-nio-8180-exec-7] org.apache.catalina.realm.JNDIRealm.authenticate Exception performing authentication. Retrying...
javax.naming.CommunicationException [Root exception is java.net.SocketException: Connection reset]; remaining name 'DC=companyname,DC=com'
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:162)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2740)
at com.sun.jndi.ldap.LdapCtx.ensureOpen(LdapCtx.java:2648)
at com.sun.jndi.ldap.LdapCtx.ensureOpen(LdapCtx.java:2622)
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1942)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1847)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1772)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:386)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:356)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:339)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
at org.apache.catalina.realm.JNDIRealm.getUserBySearch(JNDIRealm.java:1681)
at org.apache.catalina.realm.JNDIRealm.getUser(JNDIRealm.java:1517)
at org.apache.catalina.realm.JNDIRealm.getUser(JNDIRealm.java:1465)
at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1406)
at org.apache.catalina.realm.JNDIRealm.authenticate(JNDIRealm.java:1264)
at org.apache.catalina.realm.CombinedRealm.authenticate(CombinedRealm.java:192)
at org.apache.catalina.realm.LockOutRealm.authenticate(LockOutRealm.java:180)
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:245)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:453)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at com.sun.jndi.ldap.Connection.run(Connection.java:853)
... 1 more
2015-08-18 15:47:19.150 DEBUG 28842 --- [nio-8180-exec-1] c.c.c.a.c.s.AceConsoleUserDetailsService : Looking up user azafar200
2015-08-18 15:47:19.154 DEBUG 28842 --- [nio-8180-exec-1] c.c.c.a.c.s.AceConsoleUserDetailsService : Found user azafar200
2015-08-18 15:47:19.155 INFO 28842 --- [nio-8180-exec-1] o.s.b.a.audit.listener.AuditListener : AuditEvent [timestamp=Tue Aug 18 15:47:19 UTC 2015, principal=azafar200, type=AUTHENTICATION_SUCCESS, data={details=org.springframework.security.web.authentication.preauth.PreAuthenticatedGrantedAuthoritiesWebAuthenticationDetails@ffff4c9c: RemoteIpAddress: 10.21.138.140; SessionId: 182B7DDB80CABA34C93DD536871339B4; []}]