From 8e566026e0bf46f1c7b7ca2e38a37d2bee3a941e Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Thu, 9 Jul 2015 12:08:16 +0200 Subject: [PATCH] RedirectViews should always use RESPONSE_STATUS_ATTRIBUTE By default, RedirectViews have http10Compatible set to true, which means that they use HTTP 302 as a default HTTP response status. Setting this property to false make RedirectViews use HTTP 303 by default. Now when set to false, RedirectViews also don't use the RESPONSE_STATUS_ATTRIBUTE request attribute as a response HTTP if it is available. This commit makes both configuration choices behave the same regarding this request attribute: use it as a response status if it's available. Issue: SPR-13208 --- .../web/servlet/view/RedirectView.java | 5 +++++ .../web/servlet/view/RedirectViewTests.java | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java index c3a4e38007..acccf0b296 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java @@ -591,10 +591,15 @@ public class RedirectView extends AbstractUrlBasedView implements SmartView { String encodedRedirectURL = response.encodeRedirectURL(targetUrl); if (http10Compatible) { + HttpStatus attributeStatusCode = (HttpStatus) request.getAttribute(View.RESPONSE_STATUS_ATTRIBUTE); if (this.statusCode != null) { response.setStatus(this.statusCode.value()); response.setHeader("Location", encodedRedirectURL); } + else if (attributeStatusCode != null) { + response.setStatus(attributeStatusCode.value()); + response.setHeader("Location", encodedRedirectURL); + } else { // Send status code 302 by default. response.sendRedirect(encodedRedirectURL); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java index 13ff3ed431..0120d8b256 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java @@ -109,6 +109,18 @@ public class RedirectViewTests { assertEquals("http://url.somewhere.com", response.getHeader("Location")); } + @Test + public void attributeStatusCodeHttp10() throws Exception { + RedirectView rv = new RedirectView(); + rv.setUrl("http://url.somewhere.com"); + MockHttpServletRequest request = createRequest(); + request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.CREATED); + MockHttpServletResponse response = new MockHttpServletResponse(); + rv.render(new HashMap(), request, response); + assertEquals(201, response.getStatus()); + assertEquals("http://url.somewhere.com", response.getHeader("Location")); + } + @Test public void attributeStatusCodeHttp11() throws Exception { RedirectView rv = new RedirectView();