From fd3e5cf304188d724dc11a561fd13b2058e0e368 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 21 Jan 2016 15:13:37 -0800 Subject: [PATCH] Defer disable persistence logic to a listener Update TomcatEmbeddedServletContainerFactory so that logic to disable persistent sessions happens after Tomcat's standard Manager creation logic. Fixes gh-4543 --- ...TomcatEmbeddedServletContainerFactory.java | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java index 23c714deb1..0ee888b4dd 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java @@ -405,16 +405,16 @@ public class TomcatEmbeddedServletContainerFactory private void configureSession(Context context) { long sessionTimeout = getSessionTimeoutInMinutes(); context.setSessionTimeout((int) sessionTimeout); - Manager manager = context.getManager(); - if (manager == null) { - manager = new StandardManager(); - context.setManager(manager); - } if (isPersistSession()) { + Manager manager = context.getManager(); + if (manager == null) { + manager = new StandardManager(); + context.setManager(manager); + } configurePersistSession(manager); } else { - disablePersistSession(manager); + context.addLifecycleListener(new DisablePersistSessionListener()); } } @@ -427,12 +427,6 @@ public class TomcatEmbeddedServletContainerFactory ((StandardManager) manager).setPathname(file.getAbsolutePath()); } - private void disablePersistSession(Manager manager) { - if (manager instanceof StandardManager) { - ((StandardManager) manager).setPathname(null); - } - } - private long getSessionTimeoutInMinutes() { long sessionTimeout = getSessionTimeout(); if (sessionTimeout > 0) { @@ -771,4 +765,24 @@ public class TomcatEmbeddedServletContainerFactory } + /** + * {@link LifecycleListener} to disable persistence in the {@link StandardManager}. A + * {@link LifecycleListener} is used so not to interfere with Tomcat's default manager + * creation logic. + */ + private static class DisablePersistSessionListener implements LifecycleListener { + + @Override + public void lifecycleEvent(LifecycleEvent event) { + if (event.getType().equals(Lifecycle.START_EVENT)) { + Context context = (Context) event.getLifecycle(); + Manager manager = context.getManager(); + if (manager != null && manager instanceof StandardManager) { + ((StandardManager) manager).setPathname(null); + } + } + } + + } + }