diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java index e5414b89d65..1acf528930c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/session/AbstractSessionManager.java @@ -227,11 +227,25 @@ public abstract class AbstractSessionManager extends AbstractLifeCycle implement _sessionIdManager=server.getSessionIdManager(); if (_sessionIdManager==null) { - _sessionIdManager=new HashSessionIdManager(); - server.setSessionIdManager(_sessionIdManager); + //create a default SessionIdManager and set it as the shared + //SessionIdManager for the Server, being careful NOT to use + //the webapp context's classloader, otherwise if the context + //is stopped, the classloader is leaked. + ClassLoader serverLoader = server.getClass().getClassLoader(); + try + { + Thread.currentThread().setContextClassLoader(serverLoader); + _sessionIdManager=new HashSessionIdManager(); + server.setSessionIdManager(_sessionIdManager); + } + finally + { + Thread.currentThread().setContextClassLoader(_loader); + } } } } + if (!_sessionIdManager.isStarted()) _sessionIdManager.start();