You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2018/09/10 06:21:55 UTC
[cxf] branch 3.2.x-fixes updated: [CXF-7833]enable configuration to
expire jetty session
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 <fr...@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>