From 66f81daa20e2fa42f3bd47f7d616d090e3a7040e Mon Sep 17 00:00:00 2001 From: Eleftheria Stein Date: Thu, 25 Mar 2021 09:27:27 +0200 Subject: [PATCH] Throw exception if session created after response Closes gh-1798 --- .../session/web/http/SessionRepositoryFilter.java | 4 ++++ .../web/http/SessionRepositoryFilterTests.java | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/spring-session-core/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java b/spring-session-core/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java index c12e8008..93aa1564 100644 --- a/spring-session-core/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java +++ b/spring-session-core/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java @@ -309,6 +309,10 @@ public class SessionRepositoryFilter extends OncePerRequestFi if (!create) { return null; } + if (SessionRepositoryFilter.this.httpSessionIdResolver instanceof CookieHttpSessionIdResolver + && this.response.isCommitted()) { + throw new IllegalStateException("Cannot create a session after the response has been committed"); + } if (SESSION_LOGGER.isDebugEnabled()) { SESSION_LOGGER.debug( "A new session was created. To help you troubleshoot where the session was created we provided a StackTrace (this is not an error). You can prevent this from appearing by disabling DEBUG logging for " diff --git a/spring-session-core/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java b/spring-session-core/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java index 2b1a5f84..ef7d9cc1 100644 --- a/spring-session-core/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java +++ b/spring-session-core/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java @@ -62,6 +62,7 @@ import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -423,6 +424,18 @@ class SessionRepositoryFilterTests { assertThat(this.response.getCookie("SESSION")).isNotNull(); } + @Test + void doFilterGetSessionNewWhenResponseCommittedThenException() { + assertThatIllegalStateException().isThrownBy(() -> doFilter(new DoInFilter() { + @Override + public void doFilter(HttpServletRequest wrappedRequest, HttpServletResponse wrappedResponse) + throws IOException { + wrappedResponse.getWriter().flush(); + wrappedRequest.getSession(); + } + })); + } + @Test void doFilterGetSessionNew() throws Exception { doFilter(new DoInFilter() {