Skip to content

Commit 8e56602

Browse files
committed
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
1 parent de6a649 commit 8e56602

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,15 @@ protected void sendRedirect(HttpServletRequest request, HttpServletResponse resp
591591

592592
String encodedRedirectURL = response.encodeRedirectURL(targetUrl);
593593
if (http10Compatible) {
594+
HttpStatus attributeStatusCode = (HttpStatus) request.getAttribute(View.RESPONSE_STATUS_ATTRIBUTE);
594595
if (this.statusCode != null) {
595596
response.setStatus(this.statusCode.value());
596597
response.setHeader("Location", encodedRedirectURL);
597598
}
599+
else if (attributeStatusCode != null) {
600+
response.setStatus(attributeStatusCode.value());
601+
response.setHeader("Location", encodedRedirectURL);
602+
}
598603
else {
599604
// Send status code 302 by default.
600605
response.sendRedirect(encodedRedirectURL);

spring-webmvc/src/test/java/org/springframework/web/servlet/view/RedirectViewTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,18 @@ public void explicitStatusCodeHttp10() throws Exception {
109109
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
110110
}
111111

112+
@Test
113+
public void attributeStatusCodeHttp10() throws Exception {
114+
RedirectView rv = new RedirectView();
115+
rv.setUrl("http://url.somewhere.com");
116+
MockHttpServletRequest request = createRequest();
117+
request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.CREATED);
118+
MockHttpServletResponse response = new MockHttpServletResponse();
119+
rv.render(new HashMap<String, Object>(), request, response);
120+
assertEquals(201, response.getStatus());
121+
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
122+
}
123+
112124
@Test
113125
public void attributeStatusCodeHttp11() throws Exception {
114126
RedirectView rv = new RedirectView();

0 commit comments

Comments
 (0)