Adding support for different redirect result codes

WW-2289


git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@591627 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Donald J. Brown
2007-11-03 14:22:36 +00:00
parent 68b9138b63
commit c19679f6e5
2 changed files with 53 additions and 1 deletions
@@ -22,6 +22,7 @@ package org.apache.struts2.dispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static javax.servlet.http.HttpServletResponse.*;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
@@ -33,6 +34,8 @@ import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;
import java.io.IOException;
/**
* <!-- START SNIPPET: description -->
@@ -87,6 +90,8 @@ public class ServletRedirectResult extends StrutsResultSupport {
protected ActionMapper actionMapper;
protected int statusCode = SC_FOUND;
public ServletRedirectResult() {
super();
}
@@ -100,6 +105,10 @@ public class ServletRedirectResult extends StrutsResultSupport {
this.actionMapper = mapper;
}
public void setStatusCode(int code) {
this.statusCode = code;
}
/**
* Sets whether or not to prepend the servlet context path to the redirected URL.
*
@@ -150,7 +159,27 @@ public class ServletRedirectResult extends StrutsResultSupport {
LOG.debug("Redirecting to finalLocation " + finalLocation);
}
response.sendRedirect(finalLocation);
sendRedirect(response, finalLocation);
}
/**
* Sends the redirection. Can be overridden to customize how the redirect is handled (i.e. to use a different
* status code)
*
* @param response The response
* @param finalLocation The location URI
* @throws IOException
*/
protected void sendRedirect(HttpServletResponse response, String finalLocation) throws IOException {
if (SC_FOUND == statusCode) {
response.sendRedirect(finalLocation);
} else {
response.setStatus(statusCode);
response.setHeader("Location", finalLocation);
response.getWriter().write(finalLocation);
response.getWriter().close();
}
}
private static boolean isPathUrl(String url) {
@@ -21,9 +21,12 @@
package org.apache.struts2.dispatcher;
import java.util.HashMap;
import java.io.StringWriter;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static javax.servlet.http.HttpServletResponse.*;
import ognl.Ognl;
@@ -68,6 +71,26 @@ public class ServletRedirectResultTest extends StrutsTestCase implements StrutsS
}
}
public void testAbsoluteRedirect303() {
view.setLocation("/bar/foo.jsp");
view.setStatusCode(303);
responseMock.expectAndReturn("encodeRedirectURL", "/context/bar/foo.jsp", "/context/bar/foo.jsp");
responseMock.expect("setStatus", C.args(C.eq(SC_SEE_OTHER)));
responseMock.expect("setHeader", C.args(C.eq("Location"), C.eq("/context/bar/foo.jsp")));
StringWriter writer = new StringWriter();
responseMock.matchAndReturn("getWriter", new PrintWriter(writer));
try {
view.execute(ai);
requestMock.verify();
responseMock.verify();
} catch (Exception e) {
e.printStackTrace();
fail();
}
assertEquals("/context/bar/foo.jsp", writer.toString());
}
public void testPrependServletContextFalse() {
view.setLocation("/bar/foo.jsp");
view.setPrependServletContext(false);