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 eb685b04..d7643d70 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 @@ -22,8 +22,11 @@ import java.util.HashMap; import java.util.Map; import javax.servlet.FilterChain; +import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; @@ -397,6 +400,12 @@ public class SessionRepositoryFilter .getRequestedSessionId(this); } + @Override + public RequestDispatcher getRequestDispatcher(String path) { + RequestDispatcher requestDispatcher = super.getRequestDispatcher(path); + return new SessionCommittingRequestDispatcher(requestDispatcher); + } + /** * Allows creating an HttpSession from a Session instance. * @@ -417,6 +426,24 @@ public class SessionRepositoryFilter SessionRepositoryFilter.this.sessionRepository.delete(getId()); } } + + 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 { + this.delegate.forward(request, response); + } + + 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 ffd9818a..1463cca3 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,6 +1175,21 @@ public class SessionRepositoryFilterTests { }); } + @Test + public void doFilterInclude() throws Exception { + doFilter(new DoInFilter() { + @Override + public void doFilter(HttpServletRequest wrappedRequest, + HttpServletResponse wrappedResponse) throws IOException, ServletException { + String id = wrappedRequest.getSession().getId(); + wrappedRequest.getRequestDispatcher("/").include(wrappedRequest, wrappedResponse); + assertThat( + SessionRepositoryFilterTests.this.sessionRepository.getSession(id)) + .isNotNull(); + } + }); + } + // --- MultiHttpSessionStrategyAdapter @Test