我有一个 Struts2(2.2.3 版)网络应用程序。我正在尝试将旧链接重定向到新页面。我知道我可以通过
<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>
但这会statusCode=301
在最终重定向的 url 中添加一个参数。我不希望这种情况发生。所以我实施了一些其他方法,但没有成功。
例如,在从动作返回之前,我尝试status
在响应对象中设置 -
@Override
public String execute() {
...
((HttpServletResponse) response).setStatus(301);
return SUCCESS;
}
这没有用。我仍然获得链接的 302 状态。然后我创建了一个拦截器并像这样向它添加了一个 PreResultListener -
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();
}
}
}
即使这样也没有用。我仍然获得链接的 302 状态。
我也看了看redirect type=httpheader
。但我不认为这正是我想要的。因为我需要发送 301 以及 redirectedTo 页面的内容,即新链接。
有一些提到子类化org.apache.struts2.dispatcher.ServletActionRedirectResult
,然后添加statusCode
到禁止列表中。但我不知道如何RedirectResult
在工作流程中注入这个自定义。
任何帮助表示赞赏。
更新 我已经在下面发布了答案。