I have a Struts2 (version 2.2.3) web application. I am trying to redirect old links to new pages. I know I can do this via
<action name="old-action" class="MVRActionClass">
<result type="redirectAction">
<param name="actionName">new-action</param>
<param name="namespace">/new-action-namespace</param>
<param name="statusCode">301</param>
</result>
</action>
But this adds a parameter statusCode=301
in the final redirected url. I do not want this to happen. So I implemented some other approaches but it did not work out.
E.g. I tried to set the status
in the response object before returning from the action like so -
@Override
public String execute() {
...
((HttpServletResponse) response).setStatus(301);
return SUCCESS;
}
This did not work. I was still getting 302 status for the link. Then I created an Interceptor and added a PreResultListener to it like so -
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new PreResultListener() {
@Override
public void beforeResult(ActionInvocation invocation, String resultCode) {
try {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletResponse response = (HttpServletResponse).actionContext.get(StrutsStatics.HTTP_RESPONSE);
response.setStatus(301);
actionContext.put(StrutsStatics.HTTP_RESPONSE, response);
} catch(Exception e) {
invocation.setResultCode("error");
}
}
});
// Invocation Continue
return invocation.invoke();
}
}
}
Even this did not work. I was still getting 302 status for the link.
I also looked in to redirect type=httpheader
. But I dont think it is what I want exactly. Since I need to send 301 along with content of the redirectedTo page i.e. new link.
There is some mention of subclassing org.apache.struts2.dispatcher.ServletActionRedirectResult
and then adding statusCode
to the prohibited list. But I do not know how to inject this custom RedirectResult
in the workflow.
Any help is appreciated.