This is an automated email from the ASF dual-hosted git repository.
ffang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new e43575c [CXF-7833]enable configuration to expire jetty session
e43575c is described below
commit e43575cd98da664eaa66150c182c12b64a55dcef
Author: Freeman Fang <[email protected]>
AuthorDate: Mon Sep 10 12:16:40 2018 +0800
[CXF-7833]enable configuration to expire jetty session
---
.../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 1396511..3a19840 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
@@ -136,6 +136,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>