Author: rjung Date: Sat Nov 29 22:45:21 2014 New Revision: 1642482 URL: http://svn.apache.org/r1642482 Log: Backport extensible session id generator from trunk/tc8. Not contained is the change to the manager interface and the corresponding method deprecations.
Backport of r1619056, r1619106, r1619114, r1619361, r1619362, r1619583, r1631628, r1631852, r1632411. Original log messages: Make session id generation extensible. See discussion "Special requirements on session id generator" on dev list (http://marc.info/?t=139238389300003&r=1&w=2). 1) New interface org.apache.catalina.SessionIdGenerator - setter and getter for jvmRoute - setter and getter for session id length - generateSessionId() (use jvmRoute if set) and generateSessionId(String route). 2) Renamed org.apache.catalina.util.SessionIdGenerator to abstract org.apache.catalina.util.SessionIdGeneratorBase. For consistency with similar cases. 3) Adjust visibility of getRandomBytes(byte bytes[]) in SessionIdGeneratorBase from private to protected to allow extension. 4) Moved generateSessionId() from SessionIdGeneratorBase to new org.apache.catalina.util.StandardSessionIdGenerator extending SessionIdGeneratorBase and implementing SessionIdGenerator. Make SessionIdGeneratorBase abstract. 5) Changed message keys in org.apache.catalina.util.LocalStrings.properties etc. from sessionIdGenerator.* to sessionIdGeneratorBase.*. 6) Add getter and setter for SessionIdGenerator to Manager interface and to ManagerBase. Deprecated setSessionIdLength(int) and getSessionIdLength() there. Use value only if explicitly set otherwise use value from SessionIdGenerator impl. 7) Adjust SessionIdGenerator initialization in ManagerBase: uses generator set in context config if present, otherwise uses StandardSessionIdGenerator as default. 9) Add Context/Manager/SessionIdGenerator to digester ContextRuleSet. Method getSessionIdLength() and setSessionIdlength(int) in Manager interface only kept for API stability (too late for removing in TC 8). Add support for the SessionIdGenerator to cluster manager template. Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=57089 Ensure that configuration of a session ID generator is not lost when a web application is reloaded. Added: tomcat/tc7.0.x/trunk/java/org/apache/catalina/SessionIdGenerator.java - copied unchanged from r1619056, tomcat/trunk/java/org/apache/catalina/SessionIdGenerator.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java - copied, changed from r1619056, tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java - copied unchanged from r1619056, tomcat/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java tomcat/tc7.0.x/trunk/webapps/docs/config/sessionidgenerator.xml - copied unchanged from r1619106, tomcat/trunk/webapps/docs/config/sessionidgenerator.xml Removed: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGenerator.java Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1619056,1619106,1619114,1619361-1619362,1619583,1631628,1631852,1632411 Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java Sat Nov 29 22:45:21 2014 @@ -46,7 +46,8 @@ import org.apache.catalina.connector.Res import org.apache.catalina.deploy.LoginConfig; import org.apache.catalina.deploy.SecurityConstraint; import org.apache.catalina.util.DateTool; -import org.apache.catalina.util.SessionIdGenerator; +import org.apache.catalina.util.SessionIdGeneratorBase; +import org.apache.catalina.util.StandardSessionIdGenerator; import org.apache.catalina.valves.ValveBase; import org.apache.coyote.ActionCode; import org.apache.juli.logging.Log; @@ -178,7 +179,7 @@ public abstract class AuthenticatorBase */ protected String secureRandomProvider = null; - protected SessionIdGenerator sessionIdGenerator = null; + protected SessionIdGeneratorBase sessionIdGenerator = null; /** * The string manager for this package. @@ -921,7 +922,7 @@ public abstract class AuthenticatorBase log.debug("No SingleSignOn Valve is present"); } - sessionIdGenerator = new SessionIdGenerator(); + sessionIdGenerator = new StandardSessionIdGenerator(); sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); sessionIdGenerator.setSecureRandomClass(getSecureRandomClass()); sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider()); Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/ClusterRuleSet.java Sat Nov 29 22:45:21 2014 @@ -92,7 +92,13 @@ public class ClusterRuleSet extends Rule digester.addSetNext(prefix + "Manager", "setManagerTemplate", "org.apache.catalina.ha.ClusterManager"); - + digester.addObjectCreate(prefix + "Manager/SessionIdGenerator", + "org.apache.catalina.util.StandardSessionIdGenerator", + "className"); + digester.addSetProperties(prefix + "Manager/SessionIdGenerator"); + digester.addSetNext(prefix + "Manager/SessionIdGenerator", + "setSessionIdGenerator", + "org.apache.catalina.SessionIdGenerator"); digester.addObjectCreate(prefix + "Channel", null, // MUST be specified in the element Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/ClusterManagerBase.java Sat Nov 29 22:45:21 2014 @@ -25,6 +25,7 @@ import org.apache.catalina.Cluster; import org.apache.catalina.Container; import org.apache.catalina.LifecycleException; import org.apache.catalina.Loader; +import org.apache.catalina.SessionIdGenerator; import org.apache.catalina.Valve; import org.apache.catalina.ha.CatalinaCluster; import org.apache.catalina.ha.ClusterManager; @@ -195,13 +196,24 @@ public abstract class ClusterManagerBase copy.setName("Clone-from-" + getName()); copy.setMaxActiveSessions(getMaxActiveSessions()); copy.setMaxInactiveInterval(getMaxInactiveInterval()); - copy.setSessionIdLength(getSessionIdLength()); copy.setProcessExpiresFrequency(getProcessExpiresFrequency()); copy.setNotifyListenersOnReplication(isNotifyListenersOnReplication()); copy.setSessionAttributeFilter(getSessionAttributeFilter()); copy.setSecureRandomClass(getSecureRandomClass()); copy.setSecureRandomProvider(getSecureRandomProvider()); copy.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); + if (getSessionIdGenerator() != null) { + try { + SessionIdGenerator copyIdGenerator = sessionIdGeneratorClass.newInstance(); + copyIdGenerator.setSessionIdLength(getSessionIdGenerator().getSessionIdLength()); + copyIdGenerator.setJvmRoute(getSessionIdGenerator().getJvmRoute()); + copy.setSessionIdGenerator(copyIdGenerator); + } catch (InstantiationException e) { + // Ignore + } catch (IllegalAccessException e) { + // Ignore + } + } } /** Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/session/ManagerBase.java Sat Nov 29 22:45:21 2014 @@ -38,12 +38,15 @@ import java.util.concurrent.atomic.Atomi import org.apache.catalina.Container; import org.apache.catalina.Context; import org.apache.catalina.Engine; +import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleException; import org.apache.catalina.Manager; import org.apache.catalina.Session; +import org.apache.catalina.SessionIdGenerator; import org.apache.catalina.mbeans.MBeanUtils; import org.apache.catalina.util.LifecycleMBeanBase; -import org.apache.catalina.util.SessionIdGenerator; +import org.apache.catalina.util.SessionIdGeneratorBase; +import org.apache.catalina.util.StandardSessionIdGenerator; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; @@ -96,10 +99,14 @@ public abstract class ManagerBase extend protected int maxInactiveInterval = 30 * 60; + protected static final int SESSION_ID_LENGTH_UNSET = -1; + /** * The session id length of Sessions created by this Manager. + * The length should be set directly on the SessionIdGenerator. + * Setting it here is deprecated. */ - protected int sessionIdLength = 16; + protected int sessionIdLength = SESSION_ID_LENGTH_UNSET; /** @@ -133,6 +140,7 @@ public abstract class ManagerBase extend protected String secureRandomProvider = null; protected SessionIdGenerator sessionIdGenerator = null; + protected Class<? extends SessionIdGenerator> sessionIdGeneratorClass = null; /** * The longest time (in seconds) that an expired session had been alive. @@ -336,9 +344,13 @@ public abstract class ManagerBase extend * Gets the session id length (in bytes) of Sessions created by * this Manager. * + * @deprecated Use {@link SessionIdGenerator#getSessionIdLength()}. + * This method will be removed in Tomcat 9 onwards. + * * @return The session id length */ @Override + @Deprecated public int getSessionIdLength() { return (this.sessionIdLength); @@ -350,9 +362,13 @@ public abstract class ManagerBase extend * Sets the session id length (in bytes) for Sessions created by this * Manager. * + * @deprecated Use {@link SessionIdGenerator#setSessionIdLength(int)}. + * This method will be removed in Tomcat 9 onwards. + * * @param idLength The session id length */ @Override + @Deprecated public void setSessionIdLength(int idLength) { int oldSessionIdLength = this.sessionIdLength; @@ -365,6 +381,39 @@ public abstract class ManagerBase extend /** + * Gets the session id generator. + * + * @return The session id generator + */ + public SessionIdGenerator getSessionIdGenerator() { + if (sessionIdGenerator != null) { + return sessionIdGenerator; + } else if (sessionIdGeneratorClass != null) { + try { + sessionIdGenerator = sessionIdGeneratorClass.newInstance(); + return sessionIdGenerator; + } catch(IllegalAccessException ex) { + // Ignore + } catch(InstantiationException ex) { + // Ignore + } + } + return null; + } + + + /** + * Sets the session id generator + * + * @param sessionIdGenerator The session id generator + */ + public void setSessionIdGenerator(SessionIdGenerator sessionIdGenerator) { + this.sessionIdGenerator = sessionIdGenerator; + sessionIdGeneratorClass = sessionIdGenerator.getClass(); + } + + + /** * Return the descriptive short name of this Manager implementation. */ public String getName() { @@ -560,24 +609,41 @@ public abstract class ManagerBase extend sessionExpirationTiming.add(null); } - sessionIdGenerator = new SessionIdGenerator(); + /* Create sessionIdGenerator if not explicitly configured */ + SessionIdGenerator sessionIdGenerator = getSessionIdGenerator(); + if (sessionIdGenerator == null) { + sessionIdGenerator = new StandardSessionIdGenerator(); + setSessionIdGenerator(sessionIdGenerator); + } + + if (sessionIdLength != SESSION_ID_LENGTH_UNSET) { + sessionIdGenerator.setSessionIdLength(sessionIdLength); + } sessionIdGenerator.setJvmRoute(getJvmRoute()); - sessionIdGenerator.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); - sessionIdGenerator.setSecureRandomClass(getSecureRandomClass()); - sessionIdGenerator.setSecureRandomProvider(getSecureRandomProvider()); - sessionIdGenerator.setSessionIdLength(getSessionIdLength()); - - // Force initialization of the random number generator - if (log.isDebugEnabled()) - log.debug("Force random number initialization starting"); - sessionIdGenerator.generateSessionId(); - if (log.isDebugEnabled()) - log.debug("Force random number initialization completed"); + if (sessionIdGenerator instanceof SessionIdGeneratorBase) { + SessionIdGeneratorBase sig = (SessionIdGeneratorBase)sessionIdGenerator; + sig.setSecureRandomAlgorithm(getSecureRandomAlgorithm()); + sig.setSecureRandomClass(getSecureRandomClass()); + sig.setSecureRandomProvider(getSecureRandomProvider()); + } + + if (sessionIdGenerator instanceof Lifecycle) { + ((Lifecycle) sessionIdGenerator).start(); + } else { + // Force initialization of the random number generator + if (log.isDebugEnabled()) + log.debug("Force random number initialization starting"); + sessionIdGenerator.generateSessionId(); + if (log.isDebugEnabled()) + log.debug("Force random number initialization completed"); + } } @Override protected void stopInternal() throws LifecycleException { - this.sessionIdGenerator = null; + if (sessionIdGenerator instanceof Lifecycle) { + ((Lifecycle) sessionIdGenerator).stop(); + } } Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/startup/ContextRuleSet.java Sat Nov 29 22:45:21 2014 @@ -161,6 +161,14 @@ public class ContextRuleSet extends Rule "setStore", "org.apache.catalina.Store"); + digester.addObjectCreate(prefix + "Context/Manager/SessionIdGenerator", + "org.apache.catalina.util.StandardSessionIdGenerator", + "className"); + digester.addSetProperties(prefix + "Context/Manager/SessionIdGenerator"); + digester.addSetNext(prefix + "Context/Manager/SessionIdGenerator", + "setSessionIdGenerator", + "org.apache.catalina.SessionIdGenerator"); + digester.addObjectCreate(prefix + "Context/Parameter", "org.apache.catalina.deploy.ApplicationParameter"); digester.addSetProperties(prefix + "Context/Parameter"); Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings.properties Sat Nov 29 22:45:21 2014 @@ -42,8 +42,8 @@ requestUtil.parseParameters.uee=Unable t requestUtil.urlDecode.missingDigit=The % character must be followed by two hexademical digits requestUtil.urlDecode.uee=Unable to URL decode the specified input since the encoding [{0}] is not supported. SecurityUtil.doAsPrivilege=An exception occurs when running the PrivilegedExceptionAction block. -sessionIdGenerator.createRandom=Creation of SecureRandom instance for session ID generation using [{0}] took [{1}] milliseconds. -sessionIdGenerator.random=Exception initializing random number generator of class [{0}]. Falling back to java.secure.SecureRandom -sessionIdGenerator.randomAlgorithm=Exception initializing random number generator using algorithm [{0}] -sessionIdGenerator.randomProviderException initializing random number generator using provider [{0}] +sessionIdGeneratorBase.createRandom=Creation of SecureRandom instance for session ID generation using [{0}] took [{1}] milliseconds. +sessionIdGeneratorBase.random=Exception initializing random number generator of class [{0}]. Falling back to java.secure.SecureRandom +sessionIdGeneratorBase.randomAlgorithm=Exception initializing random number generator using algorithm [{0}] +sessionIdGeneratorBase.randomProvider=Exception initializing random number generator using provider [{0}] Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_es.properties Sat Nov 29 22:45:21 2014 @@ -22,4 +22,4 @@ extensionValidator.extension-not-found-e extensionValidator.extension-validation-error = ExtensionValidator[{0}]\: Imposible de hallar la(s) extension(es) {1} requerida(s). extensionValidator.failload = No pude cargar la extensi\u00F3n {0} SecurityUtil.doAsPrivilege = Una excepci\u00F3n se ha producido durante la ejecuci\u00F3n del bloque PrivilegedExceptionAction. -sessionIdGenerator.random = Excepci\u00F3n inicializando generador de n\u00FAmeros aleatorios de clase {0} +sessionIdGeneratorBase.random = Excepci\u00F3n inicializando generador de n\u00FAmeros aleatorios de clase {0} Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_fr.properties Sat Nov 29 22:45:21 2014 @@ -22,4 +22,4 @@ extensionValidator.web-application-manif extensionValidator.extension-not-found-error=ExtensionValidator[{0}][{1}]: L''extension requise "{2}" est introuvable. extensionValidator.extension-validation-error=ExtensionValidator[{0}]: Impossible de trouver {1} extension(s) requise(s). SecurityUtil.doAsPrivilege=Une exception s''est produite lors de l''execution du bloc PrivilegedExceptionAction. -sessionIdGenerator.random=Exception durant l''initialisation de la classe du g\u00e9n\u00e9rateur de nombre al\u00e9atoire {0} +sessionIdGeneratorBase.random=Exception durant l''initialisation de la classe du g\u00e9n\u00e9rateur de nombre al\u00e9atoire {0} Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/LocalStrings_ja.properties Sat Nov 29 22:45:21 2014 @@ -23,4 +23,4 @@ extensionValidator.extension-not-found-e extensionValidator.extension-validation-error=ExtensionValidator[{0}]: \u5fc5\u8981\u306a\u62e1\u5f35 "{1}" \u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002 extensionValidator.failload=\u62e1\u5f35 {0} \u306e\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f SecurityUtil.doAsPrivilege=PrivilegedExceptionAction\u30d6\u30ed\u30c3\u30af\u3092\u5b9f\u884c\u4e2d\u306b\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 -sessionIdGenerator.random=\u30af\u30e9\u30b9 {0} \u306e\u4e71\u6570\u767a\u751f\u5668\u306e\u521d\u671f\u5316\u306e\u4f8b\u5916\u3067\u3059 +sessionIdGeneratorBase.random=\u30af\u30e9\u30b9 {0} \u306e\u4e71\u6570\u767a\u751f\u5668\u306e\u521d\u671f\u5316\u306e\u4f8b\u5916\u3067\u3059 Copied: tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java (from r1619056, tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java) URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java?p2=tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java&p1=tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java&r1=1619056&r2=1642482&rev=1642482&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/util/SessionIdGeneratorBase.java Sat Nov 29 22:45:21 2014 @@ -22,12 +22,15 @@ import java.security.SecureRandom; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.LifecycleState; import org.apache.catalina.SessionIdGenerator; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; -public abstract class SessionIdGeneratorBase implements SessionIdGenerator { +public abstract class SessionIdGeneratorBase extends LifecycleBase + implements SessionIdGenerator { private static final Log log = LogFactory.getLog(SessionIdGeneratorBase.class); @@ -43,7 +46,7 @@ public abstract class SessionIdGenerator * designed this way since random number generators use a sync to make them * thread-safe and the sync makes using a a single object slow(er). */ - private final Queue<SecureRandom> randoms = new ConcurrentLinkedQueue<>(); + private final Queue<SecureRandom> randoms = new ConcurrentLinkedQueue<SecureRandom>(); /** @@ -239,4 +242,32 @@ public abstract class SessionIdGenerator result.getAlgorithm(), Long.valueOf(t2-t1))); return result; } + + + @Override + protected void initInternal() throws LifecycleException { + // NO-OP + } + + + @Override + protected void startInternal() throws LifecycleException { + // Ensure SecureRandom has been initialised + generateSessionId(); + + setState(LifecycleState.STARTING); + } + + + @Override + protected void stopInternal() throws LifecycleException { + setState(LifecycleState.STOPPING); + randoms.clear(); + } + + + @Override + protected void destroyInternal() throws LifecycleException { + // NO-OP + } } Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Sat Nov 29 22:45:21 2014 @@ -84,6 +84,11 @@ <bug>57239</bug>: Correct several message typos. Includes patch by vladk. (kkolinko) </fix> + <add> + Make the session id generator extensible by adding a + <code>SessionIdGenerator</code> interface, an abstract + base class and a standard implementation. (rjung) + </add> </changelog> </subsection> <subsection name="Coyote"> Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/config/cluster-manager.xml Sat Nov 29 22:45:21 2014 @@ -106,7 +106,8 @@ <p>The length of session ids created by this Manager, measured in bytes, excluding subsequent conversion to a hexadecimal string and excluding any JVM route information used for load balancing. - The default is 16.</p> + The default is 16. You should set the length on a nested + <strong>SessionIdGenerator</strong> element instead.</p> </attribute> <attribute name="processExpiresFrequency" required="false"> <p>Frequency of the session expiration, and related manager operations. @@ -230,5 +231,21 @@ </attributes> </subsection> </section> +<section name="Nested Components"> + <h3>All Manager Implementations</h3> + <p>All Manager implementations allow nesting of a + <strong><SessionIdGenerator></strong> element. It defines + the behavior of session id generation. All implementations + of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the + following attributes: + </p> + <attributes> + <attribute name="sessionIdLength" required="false"> + <p>The length of the session ID may be changed with the + <strong>sessionIdLength</strong> attribute. + </p> + </attribute> + </attributes> +</section> </body> </document> Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/config/manager.xml Sat Nov 29 22:45:21 2014 @@ -104,7 +104,8 @@ <p>The length of session ids created by this Manager, measured in bytes, excluding subsequent conversion to a hexadecimal string and excluding any JVM route information used for load balancing. - The default is 16.</p> + The default is 16. You should set the length on a nested + <strong>SessionIdGenerator</strong> element instead.</p> </attribute> </attributes> @@ -276,11 +277,25 @@ <section name="Nested Components"> - <h3>Standard Manager Implementation</h3> + <h3>All Manager Implementations</h3> - <p>If you are using the <em>Standard Manager Implementation</em> - as described above, no elements may be nested inside your - <strong><Manager></strong> element.</p> + <p>All Manager implementations bundled with Tomcat or extending + <code>ManagerBase</code> allow nesting of a + <strong><SessionIdGenerator></strong> element. It defines + the behavior of session id generation. All implementations + of the <a href="sessionidgenerator.html">SessionIdGenerator</a> allow the + following attributes: + </p> + + <attributes> + + <attribute name="sessionIdLength" required="false"> + <p>The length of the session ID may be changed with the + <strong>sessionIdLength</strong> attribute. + </p> + </attribute> + + </attributes> <h3>Persistent Manager Implementation</h3> Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml?rev=1642482&r1=1642481&r2=1642482&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml (original) +++ tomcat/tc7.0.x/trunk/webapps/docs/config/project.xml Sat Nov 29 22:45:21 2014 @@ -63,6 +63,7 @@ <item name="Manager" href="manager.html"/> <item name="Realm" href="realm.html"/> <item name="Resources" href="resources.html"/> + <item name="SessionIdGenerator" href="sessionidgenerator.html"/> <item name="Valve" href="valve.html"/> </menu> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org