// Use LinkedList as the Deques are initialised by filling with null protectedfinal Deque<SessionTiming> sessionCreationTiming = new LinkedList<>(); protectedfinal Deque<SessionTiming> sessionExpirationTiming = new LinkedList<>();
/** *Numberofsessionsthathaveexpired.
*/ protectedfinal AtomicLong expiredSessions = new AtomicLong(0);
/** *ThesetofcurrentlyactiveSessionsforthisManager,keyedbysessionidentifier.
*/ protected Map<String,Session> sessions = new ConcurrentHashMap<>();
// Number of sessions created by this manager protectedlong sessionCounter = 0;
protectedvolatileint maxActive = 0;
privatefinal Object maxActiveUpdateLock = new Object();
public ManagerBase() { if (Globals.IS_SECURITY_ENABLED) { // Minimum set required for default distribution/persistence to work // plus String // plus SerializablePrincipal and String[] (required for authentication persistence)
setSessionAttributeValueClassNameFilter("java\\.lang\\.(?:Boolean|Integer|Long|Number|String)" + "|org\\.apache\\.catalina\\.realm\\.GenericPrincipal\\$SerializablePrincipal" + "|\\[Ljava.lang.String;");
setWarnOnSessionAttributeFilterFailure(true);
}
}
// Ensure caches for timing stats are the right size by filling with // nulls. synchronized (sessionCreationTiming) { while (sessionCreationTiming.size() < TIMING_STATS_CACHE_SIZE) {
sessionCreationTiming.add(null);
}
} synchronized (sessionExpirationTiming) { while (sessionExpirationTiming.size() < TIMING_STATS_CACHE_SIZE) {
sessionExpirationTiming.add(null);
}
}
/* Create sessionIdGenerator if not explicitly configured */
SessionIdGenerator sessionIdGenerator = getSessionIdGenerator(); if (sessionIdGenerator == null) {
sessionIdGenerator = new StandardSessionIdGenerator();
setSessionIdGenerator(sessionIdGenerator);
}
sessionIdGenerator.setJvmRoute(getJvmRoute()); 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");
}
}
}
// 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(getContext().getSessionTimeout() * 60);
String id = sessionId; if (id == null) {
id = generateSessionId();
}
session.setId(id);
sessionCounter++;
@Override publicvoid remove(Session session, boolean update) { // If the session has expired - as opposed to just being removed from // the manager because it is being persisted - update the expired stats if (update) { long timeNow = System.currentTimeMillis(); int timeAlive = (int) (timeNow - session.getCreationTimeInternal()) / 1000;
updateSessionMaxAliveTime(timeAlive);
expiredSessions.incrementAndGet();
SessionTiming timing = new SessionTiming(timeNow, timeAlive); synchronized (sessionExpirationTiming) {
sessionExpirationTiming.add(timing);
sessionExpirationTiming.poll();
}
}
if (session.getIdInternal() != null) {
sessions.remove(session.getIdInternal());
}
}
do { if (result != null) { // Not thread-safe but if one of multiple increments is lost // that is not a big deal since the fact that there was any // duplicate is a much bigger issue.
duplicates++;
}
/** *RetrievetheenclosingEngineforthisManager. * *@returnanEngineobject(ornull).
*/ public Engine getEngine() {
Engine e = null; for (Container c = getContext(); e == null && c != null; c = c.getParent()) { if (c instanceof Engine) {
e = (Engine) c;
}
} return e;
}
/** *RetrievetheJvmRoutefortheenclosingEngine. * *@returntheJvmRouteornull.
*/ public String getJvmRoute() {
Engine e = getEngine(); return e == null ? null : e.getJvmRoute();
}
privatestaticint calculateRate(List<SessionTiming> sessionTiming) { // Init long now = System.currentTimeMillis(); long oldest = now; int counter = 0; int result = 0;
// Calculate rate for (SessionTiming timing : sessionTiming) { if (timing != null) {
counter++; if (timing.getTimestamp() < oldest) {
oldest = timing.getTimestamp();
}
}
} if (counter > 0) { if (oldest < now) {
result = (1000 * 60 * counter) / (int) (now - oldest);
} else { // Better than reporting zero
result = Integer.MAX_VALUE;
}
} return result;
}
/** *Fordebugging. * *@returnAspaceseparatedlistofallsessionIDscurrentlyactive
*/ public String listSessionIds() {
StringBuilder sb = new StringBuilder(); for (String s : sessions.keySet()) {
sb.append(s).append(' ');
} return sb.toString();
}
/** *Fordebugging. * *@paramsessionIdTheIDforthesessionofinterest *@paramkeyThekeyfortheattributetoobtain * *@returnTheattributevalueforthespecifiedsession,iffound,nullotherwise
*/ public String getSessionAttribute(String sessionId, String key) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} returnnull;
}
Object o = s.getSession().getAttribute(key); if (o == null) { returnnull;
} return o.toString();
}
/** *Returnsinformationaboutthesessionwiththegivensessionid. *<p> *ThesessioninformationisorganizedasaHashMap,mappingsessionattributenamestotheStringrepresentation *oftheirvalues. * *@paramsessionIdSessionid * *@returnHashMapmappingsessionattributenamestotheStringrepresentationoftheirvalues,ornullifno *sessionwiththespecifiedidexists,orifthesessiondoesnothaveanyattributes
*/ public HashMap<String,String> getSession(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} returnnull;
}
Enumeration<String> ee = s.getSession().getAttributeNames(); if (ee == null || !ee.hasMoreElements()) { returnnull;
}
HashMap<String,String> map = new HashMap<>(); while (ee.hasMoreElements()) {
String attrName = ee.nextElement();
map.put(attrName, getSessionAttribute(sessionId, attrName));
}
return map;
}
publicvoid expireSession(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return;
}
s.expire();
}
publiclong getThisAccessedTimestamp(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return -1;
} return s.getThisAccessedTime();
}
public String getThisAccessedTime(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return"";
} returnnew Date(s.getThisAccessedTime()).toString();
}
publiclong getLastAccessedTimestamp(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return -1;
} return s.getLastAccessedTime();
}
public String getLastAccessedTime(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return"";
} returnnew Date(s.getLastAccessedTime()).toString();
}
public String getCreationTime(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return"";
} returnnew Date(s.getCreationTime()).toString();
}
publiclong getCreationTimestamp(String sessionId) {
Session s = sessions.get(sessionId); if (s == null) { if (log.isInfoEnabled()) {
log.info(sm.getString("managerBase.sessionNotFound", sessionId));
} return -1;
} return s.getCreationTime();
}
@Override public String toString() { return ToStringUtil.toString(this, context);
}
// -------------------- JMX and Registration --------------------
@Override public String getObjectNameKeyProperties() {
StringBuilder name = new StringBuilder("type=Manager");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.