diff --git a/spring-session/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java b/spring-session/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java index d7643d70..57c49e12 100644 --- a/spring-session/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java +++ b/spring-session/src/main/java/org/springframework/session/web/http/SessionRepositoryFilter.java @@ -75,6 +75,7 @@ import org.springframework.session.SessionRepository; * @param the {@link ExpiringSession} type. * @since 1.0 * @author Rob Winch + * @author Josh Cummings */ @Order(SessionRepositoryFilter.DEFAULT_ORDER) public class SessionRepositoryFilter @@ -427,21 +428,31 @@ public class SessionRepositoryFilter } } - private final class SessionCommittingRequestDispatcher implements RequestDispatcher { + /** + * Ensures session is committed before issuing an include. + * + * @since 1.3.4 + */ + private final class SessionCommittingRequestDispatcher + implements RequestDispatcher { + private final RequestDispatcher delegate; SessionCommittingRequestDispatcher(RequestDispatcher delegate) { this.delegate = delegate; } - 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); } - 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/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java b/spring-session/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java index 1463cca3..bcaeac8d 100644 --- a/spring-session/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java +++ b/spring-session/src/test/java/org/springframework/session/web/http/SessionRepositoryFilterTests.java @@ -1175,17 +1175,18 @@ 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); - assertThat( - SessionRepositoryFilterTests.this.sessionRepository.getSession(id)) - .isNotNull(); + wrappedRequest.getRequestDispatcher("/").include(wrappedRequest, + wrappedResponse); + assertThat(SessionRepositoryFilterTests.this.sessionRepository + .getSession(id)).isNotNull(); } }); }