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 8c2c6017..80001306 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 @@ -205,6 +205,8 @@ public class SessionRepositoryFilter extends OncePerRequestFi private boolean requestedSessionCached; + private String requestedSessionId; + private Boolean requestedSessionIdValid; private boolean requestedSessionInvalidated; @@ -277,7 +279,6 @@ public class SessionRepositoryFilter extends OncePerRequestFi } return isRequestedSessionIdValid(requestedSession); } - return this.requestedSessionIdValid; } @@ -351,8 +352,10 @@ public class SessionRepositoryFilter extends OncePerRequestFi @Override public String getRequestedSessionId() { - S requestedSession = getRequestedSession(); - return (requestedSession != null) ? requestedSession.getId() : null; + if (this.requestedSessionId == null) { + getRequestedSession(); + } + return this.requestedSessionId; } private S getRequestedSession() { @@ -360,10 +363,14 @@ public class SessionRepositoryFilter extends OncePerRequestFi List sessionIds = SessionRepositoryFilter.this.httpSessionIdResolver .resolveSessionIds(this); for (String sessionId : sessionIds) { + if (this.requestedSessionId == null) { + this.requestedSessionId = sessionId; + } S session = SessionRepositoryFilter.this.sessionRepository .findById(sessionId); if (session != null) { this.requestedSession = session; + this.requestedSessionId = sessionId; break; } } @@ -375,6 +382,7 @@ public class SessionRepositoryFilter extends OncePerRequestFi private void clearRequestedSessionCache() { this.requestedSessionCached = false; this.requestedSession = null; + this.requestedSessionId = null; } /** 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 225e2d5b..c8ca0115 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 @@ -1192,6 +1192,29 @@ public class SessionRepositoryFilterTests { }); } + @Test // gh-1229 + public void doFilterAdapterGetRequestedSessionIdForInvalidSession() throws Exception { + SessionRepository sessionRepository = new MapSessionRepository( + new HashMap<>()); + + this.filter = new SessionRepositoryFilter<>(sessionRepository); + this.filter.setHttpSessionIdResolver(this.strategy); + final String expectedId = "HttpSessionIdResolver-requested-id1"; + final String otherId = "HttpSessionIdResolver-requested-id2"; + + given(this.strategy.resolveSessionIds(any(HttpServletRequest.class))) + .willReturn(Arrays.asList(expectedId, otherId)); + + doFilter(new DoInFilter() { + @Override + public void doFilter(HttpServletRequest wrappedRequest, + HttpServletResponse wrappedResponse) { + assertThat(wrappedRequest.getRequestedSessionId()).isEqualTo(expectedId); + assertThat(wrappedRequest.isRequestedSessionIdValid()).isFalse(); + } + }); + } + @Test public void doFilterAdapterOnNewSession() throws Exception { this.filter.setHttpSessionIdResolver(this.strategy);