This is an automated email from the ASF dual-hosted git repository. ffang pushed a commit to branch 3.2.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/3.2.x-fixes by this push: new 858b99a [CXF-7833]enable configuration to expire jetty session 858b99a is described below commit 858b99a4000ccb237950645075eb02226dfa7b0e Author: Freeman Fang <freeman.f...@gmail.com> AuthorDate: Mon Sep 10 12:16:40 2018 +0800 [CXF-7833]enable configuration to expire jetty session (cherry picked from commit e43575cd98da664eaa66150c182c12b64a55dcef) --- .../http_jetty/JettyHTTPServerEngine.java | 72 +++++++++++++++------- .../JettyHTTPServerEngineFactoryHolder.java | 3 + .../osgi/HTTPJettyTransportActivator.java | 2 + .../JettyHTTPServerEngineBeanDefinitionParser.java | 3 +- .../resources/schemas/configuration/http-jetty.xsd | 1 + .../http_jetty/spring/ApplicationContextTest.java | 1 + .../transport/http_jetty/spring/beans-props.xml | 1 + .../cxf/transport/http_jetty/spring/beans.xml | 1 + .../cxf/systest/http/ClientServerSessionTest.java | 12 ++++ .../org/apache/cxf/systest/http/SessionServer.xml | 1 + 10 files changed, 74 insertions(+), 23 deletions(-) diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java index 12c42a0..d15f928 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/JettyHTTPServerEngine.java @@ -105,6 +105,7 @@ public class JettyHTTPServerEngine implements ServerEngine { private String protocol = "http"; private Boolean isSessionSupport = false; + private int sessionTimeout = -1; private Boolean isReuseAddress = true; private Boolean continuationsEnabled = true; private int maxIdleTime = 200000; @@ -489,28 +490,8 @@ public class JettyHTTPServerEngine implements ServerEngine { context.setContextPath(contextName); // bind the jetty http handler with the context handler if (isSessionSupport) { - // If we have sessions, we need two handlers. - SessionHandler sh = null; - if (Server.getVersion().startsWith("9.2") - || Server.getVersion().startsWith("9.3")) { - if (sessionHandler == null) { - sessionHandler = new SessionHandler(); - } - sh = new SessionHandler(); - try { - Method get = ReflectionUtil.getDeclaredMethod(SessionHandler.class, "getSessionManager"); - Method set = ReflectionUtil.getDeclaredMethod(SessionHandler.class, - "setSessionManager", - get.getReturnType()); - ReflectionUtil.setAccessible(set) - .invoke(sh, ReflectionUtil.setAccessible(get).invoke(sessionHandler)); - } catch (Throwable t) { - //ignore, just use the new session manager - } - } else { - //9.4+ stores the session id handling and cache and everything on the server, just need the handler - sh = new SessionHandler(); - } + SessionHandler sh = configureSession(); + if (securityHandler != null) { //use the securityHander which already wrap the jetty http handler sh.setHandler(securityHandler); @@ -547,6 +528,45 @@ public class JettyHTTPServerEngine implements ServerEngine { ++servantCount; } + private SessionHandler configureSession() { + // If we have sessions, we need two handlers. + SessionHandler sh = null; + try { + if (Server.getVersion().startsWith("9.2") || Server.getVersion().startsWith("9.3")) { + if (sessionHandler == null) { + sessionHandler = new SessionHandler(); + } + sh = new SessionHandler(); + Method get = ReflectionUtil.getDeclaredMethod(SessionHandler.class, "getSessionManager"); + Method set = ReflectionUtil.getDeclaredMethod(SessionHandler.class, "setSessionManager", + get.getReturnType()); + if (this.getSessionTimeout() >= 0) { + Method setMaxInactiveInterval = ReflectionUtil + .getDeclaredMethod(get.getReturnType(), "setMaxInactiveInterval", int.class); + ReflectionUtil.setAccessible(setMaxInactiveInterval) + .invoke(ReflectionUtil.setAccessible(get).invoke(sessionHandler), 20); + } + ReflectionUtil.setAccessible(set) + .invoke(sh, ReflectionUtil.setAccessible(get).invoke(sessionHandler)); + + } else { + // 9.4+ stores the session id handling and cache and everything on the server, just need + // the handler + + sh = new SessionHandler(); + if (this.getSessionTimeout() >= 0) { + Method setMaxInactiveInterval = ReflectionUtil + .getDeclaredMethod(SessionHandler.class, "setMaxInactiveInterval", int.class); + ReflectionUtil.setAccessible(setMaxInactiveInterval).invoke(sh, 20); + } + + } + } catch (Throwable t) { + + } + return sh; + } + private String getHandlerName(URL url, ContextHandler context) { String contextPath = context.getContextPath(); String path = url.getPath(); @@ -1089,4 +1109,12 @@ public class JettyHTTPServerEngine implements ServerEngine { return sendServerVersion; } + public int getSessionTimeout() { + return sessionTimeout; + } + + public void setSessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + } + } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java index 9c9e2cc..98fe722 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/blueprint/JettyHTTPServerEngineFactoryHolder.java @@ -158,6 +158,9 @@ public class JettyHTTPServerEngineFactoryHolder { if (engine.isSessionSupport() != null) { eng.setSessionSupport(engine.isSessionSupport()); } + if (engine.getSessionTimeout() != null) { + eng.setSessionTimeout(engine.getSessionTimeout().intValue()); + } if (engine.getThreadingParameters() != null) { ThreadingParametersType threads = engine.getThreadingParameters(); ThreadingParameters rThreads = new ThreadingParameters(); diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java index 846bc7d..7dd9d42 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/osgi/HTTPJettyTransportActivator.java @@ -143,6 +143,8 @@ public class HTTPJettyTransportActivator e.setReuseAddress(Boolean.parseBoolean((String)properties.get(k))); } else if ("maxIdleTime".equals(k)) { e.setMaxIdleTime(Integer.parseInt((String)properties.get(k))); + } else if ("sessionTimeout".equals(k)) { + e.setSessionTimeout(Integer.parseInt((String)properties.get(k))); } } } diff --git a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java index 5bf0274..098fe51 100644 --- a/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java +++ b/rt/transports/http-jetty/src/main/java/org/apache/cxf/transport/http_jetty/spring/JettyHTTPServerEngineBeanDefinitionParser.java @@ -135,7 +135,8 @@ public class JettyHTTPServerEngineBeanDefinitionParser extends AbstractBeanDefin List<?> handlers = ctx.getDelegate().parseListElement(elem, bean.getBeanDefinition()); bean.addPropertyValue("handlers", handlers); - } else if ("sessionSupport".equals(name) || "reuseAddress".equals(name)) { + } else if ("sessionTimeout".equals(name) + || "sessionSupport".equals(name) || "reuseAddress".equals(name)) { String text = elem.getTextContent(); bean.addPropertyValue(name, text); } diff --git a/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd b/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd index f444bdc..c6cdcdf 100644 --- a/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd +++ b/rt/transports/http-jetty/src/main/resources/schemas/configuration/http-jetty.xsd @@ -126,6 +126,7 @@ <xs:element name="connector" type="xsd:anyType" minOccurs="0"/> <xs:element name="handlers" type="xsd:anyType" minOccurs="0"/> <xs:element name="sessionSupport" type="ptp:ParameterizedBoolean" minOccurs="0"/> + <xs:element name="sessionTimeout" type="xs:int" minOccurs="0"/> <xs:element name="reuseAddress" type="ptp:ParameterizedBoolean" minOccurs="0" /> </xs:sequence> diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java index 6e809dc..2f664c8 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/ApplicationContextTest.java @@ -138,6 +138,7 @@ public class ApplicationContextTest extends Assert { assertEquals(777, engine.getThreadingParameters().getMaxThreads()); assertEquals("AnotherPrefix", engine.getThreadingParameters().getThreadNamePrefix()); + assertEquals("session timeout should be 600 secs", 600, engine.getSessionTimeout()); assertTrue("The engine should support session manager", engine.isSessionSupport()); assertNotNull("The handlers should not be null", engine.getHandlers()); assertEquals(1, engine.getHandlers().size()); diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml index aa11f34..03d4a11 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans-props.xml @@ -61,6 +61,7 @@ <beans:bean class="org.eclipse.jetty.server.handler.DefaultHandler"/> </hj:handlers> <hj:sessionSupport>true</hj:sessionSupport> + <hj:sessionTimeout>600</hj:sessionTimeout> </hj:engine> <hj:engine port="${engine.port.nine.two}"> <hj:tlsServerParameters> diff --git a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml index acd0304..314a0ca 100644 --- a/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml +++ b/rt/transports/http-jetty/src/test/java/org/apache/cxf/transport/http_jetty/spring/beans.xml @@ -48,6 +48,7 @@ <beans:bean class="org.eclipse.jetty.server.handler.DefaultHandler"/> </hj:handlers> <hj:sessionSupport>true</hj:sessionSupport> + <hj:sessionTimeout>600</hj:sessionTimeout> </hj:engine> <hj:engine port="9002"> <hj:tlsServerParameters> diff --git a/systests/transports/src/test/java/org/apache/cxf/systest/http/ClientServerSessionTest.java b/systests/transports/src/test/java/org/apache/cxf/systest/http/ClientServerSessionTest.java index 508a2be..03b05d0 100644 --- a/systests/transports/src/test/java/org/apache/cxf/systest/http/ClientServerSessionTest.java +++ b/systests/transports/src/test/java/org/apache/cxf/systest/http/ClientServerSessionTest.java @@ -110,6 +110,18 @@ public class ClientServerSessionTest extends AbstractBusClientServerTestBase { assertEquals("Hello Hello", greeting); assertTrue(cookie.contains("a=a")); assertTrue(cookie.contains("b=b")); + + Thread.sleep(30 * 1000); //let session expire + greeting = greeter.greetMe("SessionExpire"); + cookie = ""; + if (greeting.indexOf(';') != -1) { + cookie = greeting.substring(greeting.indexOf(';')); + greeting = greeting.substring(0, greeting.indexOf(';')); + } + assertNotNull("no response received from service", greeting); + assertEquals("Hello SessionExpire", greeting); + assertTrue(cookie.contains("a=a")); + assertTrue(cookie.contains("b=b")); } catch (UndeclaredThrowableException ex) { throw (Exception)ex.getCause(); } diff --git a/systests/transports/src/test/resources/org/apache/cxf/systest/http/SessionServer.xml b/systests/transports/src/test/resources/org/apache/cxf/systest/http/SessionServer.xml index 01060a8..7ad89ad 100644 --- a/systests/transports/src/test/resources/org/apache/cxf/systest/http/SessionServer.xml +++ b/systests/transports/src/test/resources/org/apache/cxf/systest/http/SessionServer.xml @@ -22,6 +22,7 @@ <httpj:engine-factory bus="cxf"> <httpj:engine port="${testutil.ports.SessionServer}"> <httpj:sessionSupport>true</httpj:sessionSupport> + <httpj:sessionTimeout>20</httpj:sessionTimeout> <httpj:reuseAddress>false</httpj:reuseAddress> </httpj:engine> </httpj:engine-factory>