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>