Fields Summary |
---|
protected com.sun.org.apache.commons.logging.Log | log |
protected DataInputStream | randomIS |
protected String | devRandomSource |
protected static final String | DEFAULT_ALGORITHMThe default message digest algorithm to use if we cannot use
the requested one. |
protected String | algorithmThe message digest algorithm to be used when generating session
identifiers. This must be an algorithm supported by the
java.security.MessageDigest class on your platform. |
protected org.apache.catalina.Container | containerThe Container with which this Manager is associated. |
protected int | debugThe debugging detail level for this component. |
protected org.apache.catalina.DefaultContext | defaultContextThe DefaultContext with which this Manager is associated. |
protected MessageDigest | digestReturn the MessageDigest implementation to be used when
creating session identifiers. |
protected boolean | distributableThe distributable flag for Sessions created by this Manager. If this
flag is set to true , any user attributes added to a
session controlled by this Manager must be Serializable. |
protected String | entropyA String initialization parameter used to increase the entropy of
the initialization of our random number generator. |
protected org.apache.catalina.SessionLocker | sessionLockerA SessionLocker used to lock sessions (curently only
in the request dispatcher forward/include use case) |
private static final String | infoThe descriptive information string for this implementation. |
protected int | maxInactiveIntervalThe default maximum inactive interval for Sessions created by
this Manager. |
protected int | sessionIdLengthThe session id length of Sessions created by this Manager. |
protected static final String | nameThe descriptive name of this Manager implementation (for logging). |
protected Random | randomA random number generator to use when generating session identifiers. |
protected com.sun.enterprise.util.uuid.UuidGenerator | uuidGeneratorThe Uuid Generator to be used
when generating universally unique session identifiers.
HERCULES: add |
protected String | randomClassThe Java class name of the random number generator class to be used
when generating session identifiers. |
protected int | sessionMaxAliveTimeThe longest time (in seconds) that an expired session had been alive. |
protected int | sessionAverageAliveTimeAverage time (in seconds) that expired sessions had been alive. |
protected int | expiredSessionsNumber of sessions that have expired. |
protected HashMap | sessionsThe set of currently active Sessions for this Manager, keyed by
session identifier. |
protected int | sessionCounter |
protected int | maxActive |
protected int | duplicates |
protected boolean | initialized |
protected static final org.apache.catalina.util.StringManager | smThe string manager for this package. |
protected PropertyChangeSupport | supportThe property change support for this component. |
private boolean | prefixSessionID_ |
private String | prefix_ |
private static final IOUtilsCaller | webUtilsCallerUtility class used to call into services from
com.sun.ejb.base.io.IOUtils, which provides object input and output
streams for the serialization and deserialization of EJB references
stored in HTTP sessions |
protected String | domain |
protected ObjectName | oname |
protected MBeanServer | mserver |
Methods Summary |
---|
public void | add(org.apache.catalina.Session session)Add this Session to the set of active Sessions for this Manager.
synchronized (sessions) {
sessions.put(session.getIdInternal(), session);
if( sessions.size() > maxActive ) {
maxActive=sessions.size();
}
}
|
public void | addPropertyChangeListener(java.beans.PropertyChangeListener listener)Add a property change listener to this component.
support.addPropertyChangeListener(listener);
|
public void | clearSessions()clear out the sessions cache
HERCULES:added
sessions.clear();
|
public org.apache.catalina.Session | createEmptySession()Get a session from the recycled ones or create a new empty one.
The PersistentManager manager does not need to create session data
because it reads it from the Store.
return (getNewSession());
|
public org.apache.catalina.Session | createSession()Construct and return a new session object, based on the default
settings specified by this Manager's properties. The session
id will be assigned by this method, and available via the getId()
method of the returned session. If a new session cannot be created
for any reason, return null .
Hercules: modified
// Recycle or create a Session instance
Session session = null;
session = createEmptySession();
StandardSession sess = (StandardSession) session;
//always lock
sess.lockForeground();
// Initialize the properties of the new session and return it
session.setNew(true);
session.setValid(true);
session.setCreationTime(System.currentTimeMillis());
session.setMaxInactiveInterval(this.maxInactiveInterval);
//HERCULES:mod
String sessionId = generateSessionId(session);
/*
String jvmRoute = getJvmRoute();
// @todo Move appending of jvmRoute generateSessionId()???
if (jvmRoute != null) {
sessionId += '.' + jvmRoute;
}
*/
/*
synchronized (sessions) {
while (sessions.get(sessionId) != null){ // Guarantee uniqueness
duplicates++;
sessionId = generateSessionId();
// @todo Move appending of jvmRoute generateSessionId()???
if (jvmRoute != null) {
sessionId += '.' + jvmRoute;
}
}
}
*/
//end HERCULES:mod
session.setId(sessionId);
sessionCounter++;
return (session);
|
public org.apache.catalina.Session | createSession(java.lang.String sessionId)Construct and return a new session object, based on the default
settings specified by this Manager's properties, using the specified
session id.
IMPLEMENTATION NOTE: This method must be kept in sync with the
createSession method that takes no arguments.
// Recycle or create a Session instance
Session session = createEmptySession();
// Initialize the properties of the new session and return it
session.setNew(true);
session.setValid(true);
session.setCreationTime(System.currentTimeMillis());
session.setMaxInactiveInterval(this.maxInactiveInterval);
synchronized (sessions) {
if (sessions.get(sessionId) != null) {
// Session with requested id already exists
return null;
}
}
//START OF 6364900
StandardSession sess = (StandardSession) session;
//always lock
sess.lockForeground();
//END OF 6364900
session.setId(sessionId);
sessionCounter++;
return (session);
|
public void | destroy()
if( oname != null )
Registry.getRegistry().unregisterComponent(oname);
initialized=false;
oname = null;
|
public void | expireSession(java.lang.String sessionId)
Session s=(Session)sessions.get(sessionId);
if( s==null ) {
log.info("Session not found " + sessionId);
return;
}
s.expire();
|
public org.apache.catalina.Session | findSession(java.lang.String id)Return the active Session, associated with this Manager, with the
specified session id (if any); otherwise return null .
if (id == null)
return (null);
synchronized (sessions) {
Session session = (Session) sessions.get(id);
return (session);
}
|
public org.apache.catalina.Session | findSession(java.lang.String id, java.lang.String version)Finds and returns the session with the given id that also satisfies
the given version requirement.
This overloaded version of findSession() will be invoked only if
isSessionVersioningSupported() returns true. By default, this method
delegates to the version of findSession() that does not take any
session version number.
return findSession(id);
|
public org.apache.catalina.Session[] | findSessions()Return the set of active Sessions associated with this Manager.
If this Manager has no active Sessions, a zero-length array is returned.
Session results[] = null;
synchronized (sessions) {
results = new Session[sessions.size()];
results = (Session[]) sessions.values().toArray(results);
}
return (results);
|
protected synchronized java.lang.String | generateSessionId(java.lang.Object obj)Generate and return a new session identifier.
Hercules:added
String result = uuidGenerator.generateUuid(obj);
//START OF RIMOD# 5056989 -- Support for iWS6.0 style session ids
if (prefixSessionID_) {
result = prefix_ + result;
}
//END OF RIMOD# 5056989
return result;
|
protected synchronized java.lang.String | generateSessionId()Generate and return a new session identifier.
Hercules:modified
return generateSessionId(new Object());
|
public int | getActiveSessions()Returns the number of active sessions
return sessions.size();
|
public java.lang.String | getAlgorithm()Return the message digest algorithm for this Manager.
return (this.algorithm);
|
public java.lang.String | getClassName()Returns the name of the implementation class.
return this.getClass().getName();
|
public org.apache.catalina.Container | getContainer()Return the Container with which this Manager is associated.
return (this.container);
|
public int | getDebug()Return the debugging detail level for this component.
return (this.debug);
|
public org.apache.catalina.DefaultContext | getDefaultContext()Return the DefaultContext with which this Manager is associated.
return (this.defaultContext);
|
public synchronized java.security.MessageDigest | getDigest()Return the MessageDigest object to be used for calculating
session identifiers. If none has been created yet, initialize
one the first time this method is called.
if (this.digest == null) {
long t1=System.currentTimeMillis();
if (log.isDebugEnabled())
log.debug(sm.getString("managerBase.getting", algorithm));
try {
this.digest = MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
log.error(sm.getString("managerBase.digest", algorithm), e);
try {
this.digest = MessageDigest.getInstance(DEFAULT_ALGORITHM);
} catch (NoSuchAlgorithmException f) {
log.error(sm.getString("managerBase.digest",
DEFAULT_ALGORITHM), e);
this.digest = null;
}
}
if (log.isDebugEnabled())
log.debug(sm.getString("managerBase.gotten"));
long t2=System.currentTimeMillis();
if( log.isDebugEnabled() )
log.debug("getDigest() " + (t2-t1));
}
return (this.digest);
|
public boolean | getDistributable()Return the distributable flag for the sessions supported by
this Manager.
return (this.distributable);
|
public java.lang.String | getDomain()
return domain;
|
public int | getDuplicates()Number of duplicated session IDs generated by the random source.
Anything bigger than 0 means problems.
return duplicates;
|
public org.apache.catalina.Engine | getEngine()Retrieve the enclosing Engine for this Manager.
Engine e = null;
for (Container c = getContainer(); e == null && c != null ; c = c.getParent()) {
if (c != null && c instanceof Engine) {
e = (Engine)c;
}
}
return e;
|
public java.lang.String | getEntropy()Return the entropy increaser value, or compute a semi-useful value
if this String has not yet been set.
// Calculate a semi-useful value if this has not been set
if (this.entropy == null)
setEntropy(this.toString());
return (this.entropy);
|
public int | getExpiredSessions()Gets the number of sessions that have expired.
return expiredSessions;
|
public java.lang.String | getInfo()Return descriptive information about this Manager implementation and
the corresponding version number, in the format
<description>/<version> .
return (this.info);
|
public java.lang.String | getJvmRoute()Retrieve the JvmRoute for the enclosing Engine.
Engine e = getEngine();
return e == null ? null : e.getJvmRoute();
|
public java.lang.String | getLastAccessedTimeMillis(java.lang.String sessionId)
Session s=(Session)sessions.get(sessionId);
if( s==null ) {
log.info("Session not found " + sessionId);
return "";
}
return new Date(s.getLastAccessedTime()).toString();
|
public int | getMaxActive()Max number of concurent active sessions
return maxActive;
|
public int | getMaxInactiveInterval()Same as getMaxInactiveIntervalSeconds
return getMaxInactiveIntervalSeconds();
|
public int | getMaxInactiveIntervalSeconds()Return the default maximum inactive interval (in seconds)
for Sessions created by this Manager.
return (this.maxInactiveInterval);
|
public java.lang.String | getName()Return the descriptive short name of this Manager implementation.
return (name);
|
protected StandardSession | getNewSession()Get new session class to be used in the doLoad() method.
return new StandardSession(this);
|
public javax.management.ObjectName | getObjectName()
return oname;
|
public synchronized java.util.Random | getRandom()Return the random number generator instance we should use for
generating session identifiers. If there is no such generator
currently defined, construct and seed a new one.
if (this.random == null) {
synchronized (this) {
if (this.random == null) {
// Calculate the new random number generator seed
long seed = System.currentTimeMillis();
long t1 = seed;
char entropy[] = getEntropy().toCharArray();
for (int i = 0; i < entropy.length; i++) {
long update = ((byte) entropy[i]) << ((i % 8) * 8);
seed ^= update;
}
try {
// Construct and seed a new random number generator
Class clazz = Class.forName(randomClass);
this.random = (Random) clazz.newInstance();
this.random.setSeed(seed);
} catch (Exception e) {
// Fall back to the simple case
log.error(sm.getString("managerBase.random", randomClass),
e);
this.random = new java.util.Random();
this.random.setSeed(seed);
}
long t2=System.currentTimeMillis();
if( (t2-t1) > 100 )
log.debug(sm.getString("managerBase.seeding", randomClass) + " " + (t2-t1));
}
}
}
return (this.random);
|
protected void | getRandomBytes(byte[] bytes)
// Generate a byte array containing a session identifier
if( devRandomSource!=null && randomIS==null ) {
setRandomFile( devRandomSource );
}
if(randomIS!=null ) {
try {
int len=randomIS.read( bytes );
if( len==bytes.length ) {
return;
}
log.debug("Got " + len + " " + bytes.length );
} catch( Exception ex ) {
}
devRandomSource=null;
randomIS=null;
}
Random random = getRandom();
getRandom().nextBytes(bytes);
|
public java.lang.String | getRandomClass()Return the random number generator class name.
return (this.randomClass);
|
public java.lang.String | getRandomFile()
return devRandomSource;
|
public java.util.HashMap | getSession(java.lang.String sessionId)Returns information about the session with the given session id.
The session information is organized as a HashMap, mapping
session attribute names to the String representation of their values.
Session s = (Session) sessions.get(sessionId);
if (s == null) {
if (log.isInfoEnabled()) {
log.info("Session not found " + sessionId);
}
return null;
}
Enumeration ee = s.getSession().getAttributeNames();
if (ee == null || !ee.hasMoreElements()) {
return null;
}
HashMap map = new HashMap();
while (ee.hasMoreElements()) {
String attrName = (String) ee.nextElement();
map.put(attrName, getSessionAttribute(sessionId, attrName));
}
return map;
|
public java.lang.String | getSessionAttribute(java.lang.String sessionId, java.lang.String key)For debugging: get a session attribute
Session s=(Session)sessions.get(sessionId);
if( s==null ) {
log.info("Session not found " + sessionId);
return null;
}
Object o=s.getSession().getAttribute(key);
if( o==null ) return null;
return o.toString();
|
public int | getSessionAverageAliveTime()Same as getSessionAverageAliveTimeSeconds
return getSessionAverageAliveTimeSeconds();
|
public int | getSessionAverageAliveTimeSeconds()Gets the average time (in seconds) that expired sessions had been
alive.
return sessionAverageAliveTime;
|
public int | getSessionCount()Total sessions created by this manager.
return sessionCounter;
|
public int | getSessionCounter()Same as getSessionCount
return getSessionCount();
|
public int | getSessionIdLength()Gets the session id length (in bytes) of Sessions created by
this Manager.
return (this.sessionIdLength);
|
public int | getSessionMaxAliveTime()Same as getSessionMaxAliveTimeSeconds
return getSessionMaxAliveTimeSeconds();
|
public int | getSessionMaxAliveTimeSeconds()Gets the longest time (in seconds) that an expired session had been
alive.
return sessionMaxAliveTime;
|
public com.sun.enterprise.util.uuid.UuidGenerator | getUuidGenerator()Return the UuidGenerator for this Manager.
HERCULES:added
return (this.uuidGenerator);
|
protected static IOUtilsCaller | getWebUtilsCaller()Gets the utility class used to call into services from
com.sun.ejb.base.io.IOUtils.
return webUtilsCaller;
|
public void | init()
if( initialized ) return;
initialized=true;
if( oname==null ) {
try {
StandardContext ctx=(StandardContext)this.getContainer();
Engine eng=(Engine)ctx.getParent().getParent();
domain=ctx.getEngineName();
distributable = ctx.getDistributable();
StandardHost hst=(StandardHost)ctx.getParent();
String path = ctx.getEncodedPath();
if (path.equals("")) {
path = "/";
}
oname=new ObjectName(domain + ":type=Manager,path="
+ path + ",host=" + hst.getName());
Registry.getRegistry().registerComponent(this, oname, null );
} catch (Exception e) {
log.error("Error registering ",e);
}
}
log.debug("Registering " + oname );
|
public boolean | isSessionVersioningSupported()Returns true if this session manager supports session versioning, false
otherwise.
return false;
|
public java.lang.String | listSessionIds()For debugging: return a list of all session ids currently active
StringBuffer sb=new StringBuffer();
Iterator keys=sessions.keySet().iterator();
while( keys.hasNext() ) {
sb.append(keys.next()).append(" ");
}
return sb.toString();
|
public boolean | lockSession(javax.servlet.ServletRequest request)
boolean result = false;
if(sessionLocker != null) {
result = sessionLocker.lockSession(request);
}
return result;
|
protected void | log(java.lang.String message)Log a message on the Logger associated with our Container (if any).
log.info( message );
|
protected void | log(java.lang.String message, java.lang.Throwable throwable)Log a message on the Logger associated with our Container (if any).
log.info(message,throwable);
|
public void | postDeregister()
|
public void | postRegister(java.lang.Boolean registrationDone)
|
public void | postRequestDispatcherProcess(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response)
//deliberate no-op
return;
|
public void | preDeregister()
|
public javax.management.ObjectName | preRegister(javax.management.MBeanServer server, javax.management.ObjectName name)
oname=name;
mserver=server;
domain=name.getDomain();
return name;
|
public void | preRequestDispatcherProcess(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response)
//deliberate no-op
return;
|
public void | release()
clearSessions();
|
public void | remove(org.apache.catalina.Session session)Remove this Session from the active Sessions for this Manager.
synchronized (sessions) {
sessions.remove(session.getIdInternal());
}
|
public void | removePropertyChangeListener(java.beans.PropertyChangeListener listener)Remove a property change listener from this component.
support.removePropertyChangeListener(listener);
|
public void | setAlgorithm(java.lang.String algorithm)Set the message digest algorithm for this Manager.
String oldAlgorithm = this.algorithm;
this.algorithm = algorithm;
support.firePropertyChange("algorithm", oldAlgorithm, this.algorithm);
|
public void | setContainer(org.apache.catalina.Container container)Set the Container with which this Manager is associated.
Container oldContainer = this.container;
this.container = container;
support.firePropertyChange("container", oldContainer, this.container);
// TODO: find a good scheme for the log names
//log=LogFactory.getLog("tomcat.manager." + container.getName());
|
public void | setDebug(int debug)Set the debugging detail level for this component.
this.debug = debug;
|
public void | setDefaultContext(org.apache.catalina.DefaultContext defaultContext)Set the DefaultContext with which this Manager is associated.
DefaultContext oldDefaultContext = this.defaultContext;
this.defaultContext = defaultContext;
support.firePropertyChange("defaultContext", oldDefaultContext, this.defaultContext);
|
public void | setDistributable(boolean distributable)Set the distributable flag for the sessions supported by this
Manager. If this flag is set, all user data objects added to
sessions associated with this manager must implement Serializable.
boolean oldDistributable = this.distributable;
this.distributable = distributable;
support.firePropertyChange("distributable",
Boolean.valueOf(oldDistributable),
Boolean.valueOf(this.distributable));
|
public void | setDuplicates(int duplicates)
this.duplicates = duplicates;
|
public void | setEntropy(java.lang.String entropy)Set the entropy increaser value.
String oldEntropy = entropy;
this.entropy = entropy;
support.firePropertyChange("entropy", oldEntropy, this.entropy);
|
public void | setExpiredSessions(int expiredSessions)Sets the number of sessions that have expired.
this.expiredSessions = expiredSessions;
|
public void | setMaxActive(int maxActive)
this.maxActive = maxActive;
|
public void | setMaxInactiveInterval(int interval)Same as setMaxInactiveIntervalSeconds
setMaxInactiveIntervalSeconds(interval);
|
public void | setMaxInactiveIntervalSeconds(int interval)Set the default maximum inactive interval (in seconds)
for Sessions created by this Manager.
int oldMaxInactiveInterval = this.maxInactiveInterval;
this.maxInactiveInterval = interval;
support.firePropertyChange("maxInactiveInterval",
Integer.valueOf(oldMaxInactiveInterval),
Integer.valueOf(this.maxInactiveInterval));
|
public void | setRandomClass(java.lang.String randomClass)Set the random number generator class name.
String oldRandomClass = this.randomClass;
this.randomClass = randomClass;
support.firePropertyChange("randomClass", oldRandomClass,
this.randomClass);
|
public void | setRandomFile(java.lang.String s)Use /dev/random-type special device. This is new code, but may reduce
the big delay in generating the random.
You must specify a path to a random generator file. Use /dev/urandom
for linux ( or similar ) systems. Use /dev/random for maximum security
( it may block if not enough "random" exist ). You can also use
a pipe that generates random.
The code will check if the file exists, and default to java Random
if not found. There is a significant performance difference, very
visible on the first call to getSession ( like in the first JSP )
- so use it if available.
// as a hack, you can use a static file - and genarate the same
// session ids ( good for strange debugging )
if (Globals.IS_SECURITY_ENABLED){
randomIS = (DataInputStream)AccessController.doPrivileged(new PrivilegedSetRandomFile());
} else {
FileInputStream fileInputStream = null;
try{
devRandomSource=s;
File f=new File( devRandomSource );
if( ! f.exists() ) return;
fileInputStream = new FileInputStream(f);
randomIS= new DataInputStream( fileInputStream);
randomIS.readLong();
if( log.isDebugEnabled() )
log.debug( "Opening " + devRandomSource );
} catch( IOException ex ) {
randomIS=null;
} finally {
try{
if ( fileInputStream != null )
fileInputStream.close();
} catch (IOException ex){
;
}
}
}
|
public void | setSessionAverageAliveTime(int sessionAverageAliveTime)Same as setSessionAverageAliveTimeSeconds
setSessionAverageAliveTimeSeconds(sessionAverageAliveTime);
|
public void | setSessionAverageAliveTimeSeconds(int sessionAverageAliveTime)Sets the average time (in seconds) that expired sessions had been
alive.
this.sessionAverageAliveTime = sessionAverageAliveTime;
|
public void | setSessionCount(int sessionCounter)
this.sessionCounter = sessionCounter;
|
public void | setSessionCounter(int sessionCounter)Same as setSessionCount
setSessionCount(sessionCounter);
|
public void | setSessionIDPrefix(java.lang.String prefix)Enable/Disable prefixing the MD5 session id with a user specified
string
prefixSessionID_ = (prefix != null);
if (prefixSessionID_)
prefix_ = prefix;
|
public void | setSessionIdLength(int idLength)Sets the session id length (in bytes) for Sessions created by this
Manager.
int oldSessionIdLength = this.sessionIdLength;
this.sessionIdLength = idLength;
support.firePropertyChange("sessionIdLength",
Integer.valueOf(oldSessionIdLength),
Integer.valueOf(this.sessionIdLength));
|
public void | setSessionLocker(org.apache.catalina.SessionLocker sessLocker)set the pluggable sessionLocker for this manager
by default it is pre-set to no-op BaseSessionLocker
sessionLocker = sessLocker;
|
public void | setSessionMaxAliveTime(int sessionMaxAliveTime)Same as setSessionMaxAliveTimeSeconds
setSessionMaxAliveTimeSeconds(sessionMaxAliveTime);
|
public void | setSessionMaxAliveTimeSeconds(int sessionMaxAliveTime)Sets the longest time (in seconds) that an expired session had been
alive.
this.sessionMaxAliveTime = sessionMaxAliveTime;
|
public void | setUuidGenerator(com.sun.enterprise.util.uuid.UuidGenerator aUuidGenerator)Set the UuidGenerator for this Manager.
HERCULES:added
uuidGenerator = aUuidGenerator;
|
public void | unlockSession(javax.servlet.ServletRequest request)
if(sessionLocker != null) {
sessionLocker.unlockSession(request);
}
|
public void | update(javax.servlet.http.HttpSession session)Perform any operations when the request is finished.
return;
|