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
This commit is contained in:
Brian Clozel 2015-07-09 12:08:16 +02:00
parent de6a649071
commit 8e566026e0
2 changed files with 17 additions and 0 deletions

View File

@ -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);

View File

@ -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<String, Object>(), request, response);
assertEquals(201, response.getStatus());
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
}
@Test
public void attributeStatusCodeHttp11() throws Exception {
RedirectView rv = new RedirectView();