From 1ad47fc7b17cdbbd4cbf35d92464cc1e9532e680 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Mon, 13 Oct 2014 15:32:33 -0500 Subject: [PATCH] Disable onCommit after first commit At times OnCommittedResponseWrapper#onResponseCommitted() can be invoked multiple times. For example, when flush is performed multiple times. This means that the session can be written multiple times which is inefficient. Instead, we should only save on the first update. Fixes gh-57 --- .../web/http/OnCommittedResponseWrapper.java | 1 + .../http/OnCommittedResponseWrapperTests.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java b/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java index 304f7f6..60fe3a7 100644 --- a/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java +++ b/spring-session/src/main/java/org/springframework/session/web/http/OnCommittedResponseWrapper.java @@ -202,6 +202,7 @@ abstract class OnCommittedResponseWrapper extends HttpServletResponseWrapper { private void doOnResponseCommitted() { if(!disableOnCommitted) { onResponseCommitted(); + disableOnResponseCommitted(); } else if(logger.isDebugEnabled()){ logger.debug("Skip invoking on"); } diff --git a/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java b/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java index 88edc3d..d857b79 100644 --- a/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java +++ b/spring-session/src/test/java/org/springframework/session/web/http/OnCommittedResponseWrapperTests.java @@ -28,7 +28,7 @@ public class OnCommittedResponseWrapperTests { @Mock ServletOutputStream out; - HttpServletResponse response; + OnCommittedResponseWrapper response; boolean committed; @@ -1069,4 +1069,20 @@ public class OnCommittedResponseWrapperTests { assertThat(committed).isTrue(); } + + @Test + public void bufferSizeCommitsOnce() throws Exception { + String expected = "1234567890"; + when(response.getBufferSize()).thenReturn(expected.length()); + + response.getWriter().write(expected); + + assertThat(committed).isTrue(); + + committed = false; + + response.getWriter().write(expected); + + assertThat(committed).isFalse(); + } } \ No newline at end of file