From: markt Date: Fri, 7 Aug 2009 16:10:27 +0000 (+0000) Subject: Get SSL session tracking working again. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=9e3c8f577bdccb7ac01f885f23f3e49df58c0313;p=tomcat7.0 Get SSL session tracking working again. If you use http you'll get new session ID on every request If you use https you get the SSL session ID git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@802064 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/core/ApplicationContext.java b/java/org/apache/catalina/core/ApplicationContext.java index ad14fd45d..5cd227f30 100644 --- a/java/org/apache/catalina/core/ApplicationContext.java +++ b/java/org/apache/catalina/core/ApplicationContext.java @@ -47,8 +47,11 @@ import javax.servlet.SessionCookieConfig; import javax.servlet.SessionTrackingMode; import org.apache.catalina.Context; +import org.apache.catalina.Engine; import org.apache.catalina.Host; +import org.apache.catalina.Service; import org.apache.catalina.Wrapper; +import org.apache.catalina.connector.Connector; import org.apache.catalina.deploy.ApplicationParameter; import org.apache.catalina.util.Enumerator; import org.apache.catalina.util.RequestUtil; @@ -90,8 +93,8 @@ public class ApplicationContext this.context = context; this.basePath = basePath; - // Populate default session tracking modes - populateDefaultSessionTrackingModes(); + // Populate session tracking modes + populateSessionTrackingModes(); } @@ -175,6 +178,7 @@ public class ApplicationContext */ private EnumSet sessionTrackingModes = null; private EnumSet defaultSessionTrackingModes = null; + private EnumSet supportedSessionTrackingModes = null; // --------------------------------------------------------- Public Methods @@ -980,15 +984,27 @@ public class ApplicationContext return defaultSessionTrackingModes; } - private void populateDefaultSessionTrackingModes() { + private void populateSessionTrackingModes() { // URL re-writing is always enabled by default defaultSessionTrackingModes = EnumSet.of(SessionTrackingMode.URL); + supportedSessionTrackingModes = EnumSet.of(SessionTrackingMode.URL); if (context.getCookies()) { defaultSessionTrackingModes.add(SessionTrackingMode.COOKIE); + supportedSessionTrackingModes.add(SessionTrackingMode.COOKIE); } // SSL not enabled by default as it can only used on its own + // Context > Host > Engine > Service + Service s = ((Engine) context.getParent().getParent()).getService(); + Connector[] connectors = s.findConnectors(); + // Need at least one SSL enabled connector to use the SSL session ID. + for (Connector connector : connectors) { + if (Boolean.TRUE.equals(connector.getAttribute("SSLEnabled"))) { + supportedSessionTrackingModes.add(SessionTrackingMode.SSL); + break; + } + } } /** @@ -1025,7 +1041,7 @@ public class ApplicationContext // Check that only supported tracking modes have been requested for (SessionTrackingMode sessionTrackingMode : sessionTrackingModes) { - if (!defaultSessionTrackingModes.contains(sessionTrackingMode)) { + if (!supportedSessionTrackingModes.contains(sessionTrackingMode)) { throw new IllegalArgumentException(sm.getString( "applicationContext.setSessionTracking.iae.invalid", sessionTrackingMode.toString(), getContextPath()));