我有一个Struts2(2.2.3版)Web应用程序。我正在尝试将旧链接重定向到新页面。我知道我可以通过
来做到这一点 <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
。我不希望这种情况发生。所以我实施了一些其他的方法,但它没有成功。
E.g。我试图在响应对象中设置status
,然后再从动作返回 -
@Override
public String execute() {
...
((HttpServletResponse) response).setStatus(301);
return SUCCESS;
}
这不起作用。我仍然获得该链接的302状态。然后我创建了一个Interceptor并向它添加了一个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
。
感谢任何帮助。
答案 0 :(得分:3)
在结果处理期间,statusCode
似乎未从参数列表中删除。
要使用自己的结果类型,只需将其定义为任何其他结果类型,然后使用它而不是redirectAction
。这在Result Configuration docs中讨论。您应该只能覆盖getProhibitedResultParams()
并将statusCode
添加到列表中。
IMO statusCode应该在该列表中。有JIRA ticket for this already。
答案 1 :(得分:0)
如果某人遇到与我相同的问题,我就会根据Dave's answer解决此问题。
首先在包中声明结果类型,您将在其中调用此结果类型。
<result-types>
<result-type name="premanentRedirectAction"
class="management.dispatcher.ServletActionPermanentRedirectResult" />
</result-types>
然后只需简单地定义结果类型 -
package management.dispatcher;
import java.util.List;
import org.apache.struts2.dispatcher.ServletActionRedirectResult;
import com.google.common.collect.Lists;
public class ServletActionPermanentRedirectResult extends ServletActionRedirectResult {
private static final long serialVersionUID = 4921150146065435746L;
@Override
protected List<String> getProhibitedResultParams() {
List<String> prohibitedResultParams = Lists.newArrayList(super.getProhibitedResultParams());
prohibitedResultParams.add("statusCode");
return prohibitedResultParams;
}
}
然后,如果旧操作具有以下映射,则需要使用301重定向的任何位置 -
<action name="media-coverage">
<result type="premanentRedirectAction">
<param name="actionName">press</param>
<param name="namespace">/</param>
<param name="statusCode">301</param>
</result>
</action>