SPR-8612 Allow explicit status code in HTTP 1.0 compatibility mode

This commit is contained in:
Rossen Stoyanchev 2011-08-15 12:25:28 +00:00
parent 936c83b030
commit 224bce1b64
2 changed files with 35 additions and 12 deletions

View File

@ -49,9 +49,9 @@ import org.springframework.web.util.WebUtils;
* <p>View that redirects to an absolute, context relative, or current request * <p>View that redirects to an absolute, context relative, or current request
* relative URL. The URL may be a URI template in which case the URI template * relative URL. The URL may be a URI template in which case the URI template
* variables will be replaced with values available in the model. By default * variables will be replaced with values available in the model. By default
* all primitive model attributes (or collections thereof), not used as URI * all primitive model attributes (or collections thereof) are exposed as HTTP
* template variables, are exposed as HTTP query parameters, but this * query parameters (assuming they've not been used as URI template variables),
* behavior can be changed by overriding the * but this behavior can be changed by overriding the
* {@link #isEligibleProperty(String, Object)} method. * {@link #isEligibleProperty(String, Object)} method.
* *
* <p>A URL for this view is supposed to be a HTTP redirect URL, i.e. * <p>A URL for this view is supposed to be a HTTP redirect URL, i.e.
@ -264,11 +264,14 @@ public class RedirectView extends AbstractUrlBasedView {
FlashMap flashMap = RequestContextUtils.getFlashMap(request); FlashMap flashMap = RequestContextUtils.getFlashMap(request);
if (!CollectionUtils.isEmpty(flashMap)) { if (!CollectionUtils.isEmpty(flashMap)) {
flashMap.setExpectedUrl(request, targetUrl.toString()).setExpectedRequestParams(model); flashMap.setExpectedUrlPath(request, targetUrl.toString());
} }
if (this.exposeModelAttributes) { if (this.exposeModelAttributes) {
appendQueryProperties(targetUrl, model, enc); appendQueryProperties(targetUrl, model, enc);
if (!CollectionUtils.isEmpty(flashMap)) {
flashMap.setExpectedRequestParams(model);
}
} }
return targetUrl.toString(); return targetUrl.toString();
@ -468,14 +471,22 @@ public class RedirectView extends AbstractUrlBasedView {
HttpServletRequest request, HttpServletResponse response, String targetUrl, boolean http10Compatible) HttpServletRequest request, HttpServletResponse response, String targetUrl, boolean http10Compatible)
throws IOException { throws IOException {
String encodedRedirectURL = response.encodeRedirectURL(targetUrl);
if (http10Compatible) { if (http10Compatible) {
// Always send status code 302. if (this.statusCode != null) {
response.sendRedirect(response.encodeRedirectURL(targetUrl)); response.setStatus(this.statusCode.value());
response.setHeader("Location", encodedRedirectURL);
}
else {
// Send status code 302 by default.
response.sendRedirect(encodedRedirectURL);
}
} }
else { else {
HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl); HttpStatus statusCode = getHttp11StatusCode(request, response, targetUrl);
response.setStatus(statusCode.value()); response.setStatus(statusCode.value());
response.setHeader("Location", response.encodeRedirectURL(targetUrl)); response.setHeader("Location", encodedRedirectURL);
} }
} }

View File

@ -69,20 +69,32 @@ public class RedirectViewTests {
} }
@Test @Test
public void explicitStatusCode() throws Exception { public void explicitStatusCodeHttp11() throws Exception {
RedirectView rv = new RedirectView(); RedirectView rv = new RedirectView();
rv.setUrl("http://url.somewhere.com"); rv.setUrl("http://url.somewhere.com");
rv.setHttp10Compatible(false); rv.setHttp10Compatible(false);
rv.setStatusCode(HttpStatus.CREATED); rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = new MockHttpServletResponse();
rv.render(new HashMap<String, Object>(), request, response); rv.render(new HashMap<String, Object>(), request, response);
assertEquals(201, response.getStatus()); assertEquals(301, response.getStatus());
assertEquals("http://url.somewhere.com", response.getHeader("Location")); assertEquals("http://url.somewhere.com", response.getHeader("Location"));
} }
@Test @Test
public void attributeStatusCode() throws Exception { public void explicitStatusCodeHttp10() throws Exception {
RedirectView rv = new RedirectView();
rv.setUrl("http://url.somewhere.com");
rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
rv.render(new HashMap<String, Object>(), request, response);
assertEquals(301, response.getStatus());
assertEquals("http://url.somewhere.com", response.getHeader("Location"));
}
@Test
public void attributeStatusCodeHttp11() throws Exception {
RedirectView rv = new RedirectView(); RedirectView rv = new RedirectView();
rv.setUrl("http://url.somewhere.com"); rv.setUrl("http://url.somewhere.com");
rv.setHttp10Compatible(false); rv.setHttp10Compatible(false);