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 304f7f60..60fe3a78 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 88edc3d3..d857b79c 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