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 19fb86fa..4cd10f1b 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 @@ -74,6 +74,7 @@ import org.springframework.session.SessionRepository; * @since 1.0 * @author Rob Winch * @author Vedran Pavic + * @author Josh Cummings */ @Order(SessionRepositoryFilter.DEFAULT_ORDER) public class SessionRepositoryFilter extends OncePerRequestFilter { @@ -416,7 +417,14 @@ public class SessionRepositoryFilter extends OncePerRequestFi } } - private final class SessionCommittingRequestDispatcher implements RequestDispatcher { + /** + * Ensures session is committed before issuing an include. + * + * @since 2.1.2 + */ + private final class SessionCommittingRequestDispatcher + implements RequestDispatcher { + private final RequestDispatcher delegate; SessionCommittingRequestDispatcher(RequestDispatcher delegate) { @@ -424,15 +432,18 @@ public class SessionRepositoryFilter extends OncePerRequestFi } @Override - public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException { + public void forward(ServletRequest request, ServletResponse response) + throws ServletException, IOException { this.delegate.forward(request, response); } @Override - public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException { + public void include(ServletRequest request, ServletResponse response) + throws ServletException, IOException { SessionRepositoryRequestWrapper.this.commitSession(); this.delegate.include(request, response); } + } } 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 c24aa0a0..439f6e90 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 @@ -1170,17 +1170,19 @@ public class SessionRepositoryFilterTests { }); } - @Test + @Test // gh-1243 public void doFilterInclude() throws Exception { doFilter(new DoInFilter() { @Override public void doFilter(HttpServletRequest wrappedRequest, - HttpServletResponse wrappedResponse) throws IOException, ServletException { + HttpServletResponse wrappedResponse) + throws IOException, ServletException { String id = wrappedRequest.getSession().getId(); - wrappedRequest.getRequestDispatcher("/").include(wrappedRequest, wrappedResponse); + wrappedRequest.getRequestDispatcher("/").include(wrappedRequest, + wrappedResponse); assertThat( SessionRepositoryFilterTests.this.sessionRepository.findById(id)) - .isNotNull(); + .isNotNull(); } }); }