Skip to content

Commit fd3e5cf

Browse files
committed
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
1 parent e520c47 commit fd3e5cf

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -405,16 +405,16 @@ protected void configureContext(Context context,
405405
private void configureSession(Context context) {
406406
long sessionTimeout = getSessionTimeoutInMinutes();
407407
context.setSessionTimeout((int) sessionTimeout);
408-
Manager manager = context.getManager();
409-
if (manager == null) {
410-
manager = new StandardManager();
411-
context.setManager(manager);
412-
}
413408
if (isPersistSession()) {
409+
Manager manager = context.getManager();
410+
if (manager == null) {
411+
manager = new StandardManager();
412+
context.setManager(manager);
413+
}
414414
configurePersistSession(manager);
415415
}
416416
else {
417-
disablePersistSession(manager);
417+
context.addLifecycleListener(new DisablePersistSessionListener());
418418
}
419419
}
420420

@@ -427,12 +427,6 @@ private void configurePersistSession(Manager manager) {
427427
((StandardManager) manager).setPathname(file.getAbsolutePath());
428428
}
429429

430-
private void disablePersistSession(Manager manager) {
431-
if (manager instanceof StandardManager) {
432-
((StandardManager) manager).setPathname(null);
433-
}
434-
}
435-
436430
private long getSessionTimeoutInMinutes() {
437431
long sessionTimeout = getSessionTimeout();
438432
if (sessionTimeout > 0) {
@@ -771,4 +765,24 @@ private String getEmptyWebXml() {
771765

772766
}
773767

768+
/**
769+
* {@link LifecycleListener} to disable persistence in the {@link StandardManager}. A
770+
* {@link LifecycleListener} is used so not to interfere with Tomcat's default manager
771+
* creation logic.
772+
*/
773+
private static class DisablePersistSessionListener implements LifecycleListener {
774+
775+
@Override
776+
public void lifecycleEvent(LifecycleEvent event) {
777+
if (event.getType().equals(Lifecycle.START_EVENT)) {
778+
Context context = (Context) event.getLifecycle();
779+
Manager manager = context.getManager();
780+
if (manager != null && manager instanceof StandardManager) {
781+
((StandardManager) manager).setPathname(null);
782+
}
783+
}
784+
}
785+
786+
}
787+
774788
}

0 commit comments

Comments
 (0)