Java 在Struts2中,如何在URL中不显示参数的情况下执行永久重定向(状态代码301)
我有一个Struts2(版本2.2.3)web应用程序。我正在尝试将旧链接重定向到新页面。我知道我可以通过Java 在Struts2中,如何在URL中不显示参数的情况下执行永久重定向(状态代码301),java,redirect,struts2,http-status-code-301,Java,Redirect,Struts2,Http Status Code 301,我有一个Struts2(版本2.2.3)web应用程序。我正在尝试将旧链接重定向到新页面。我知道我可以通过 <action name="old-action" class="MVRActionClass"> <result type="redirectAction"> <param name="actionName">new-action</param> <param n
<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>
这不起作用。我仍然得到302状态的链接。然后我创建了一个拦截器,并像这样添加了一个PreResultListener-
@Override
public String execute() {
...
((HttpServletResponse) response).setStatus(301);
return SUCCESS;
}
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();
}
}
}
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;
}
}
即使这样也不行。我仍然得到302状态的链接
我还查看了重定向类型=httpheader
。但我不认为这正是我想要的。因为我需要将301和重定向的内容一起发送到页面,即新链接
有人提到将org.apache.struts2.dispatcher.ServletActionRedirectResult
子类化,然后将statusCode
添加到禁止列表中。但我不知道如何在工作流中注入此自定义重定向结果
感谢您的帮助
更新
在结果处理过程中,statusCode
似乎没有从参数列表中删除
要使用您自己的结果类型,只需将其定义为任何其他结果类型,并使用它而不是redirectAction
。本节将对此进行讨论。您应该能够覆盖getProhibitedResultParams()
并将statusCode
添加到列表中
IMO状态代码应该在该列表中。有一个。如果有人和我有相同的问题,这就是我解决问题的方法
首先在包中声明要调用此结果类型的结果类型
<result-types>
<result-type name="premanentRedirectAction"
class="management.dispatcher.ServletActionPermanentRedirectResult" />
</result-types>
然后简单地定义结果类型,如下所示-
@Override
public String execute() {
...
((HttpServletResponse) response).setStatus(301);
return SUCCESS;
}
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();
}
}
}
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;
}
}
packagemanagement.dispatcher;
导入java.util.List;
导入org.apache.struts2.dispatcher.ServletActionRedirectResult;
导入com.google.common.collect.list;
公共类ServletActionPermanentRedirectResult扩展了ServletActionRedirectResult{
私有静态最终长serialVersionUID=4921150146065435746L;
@凌驾
受保护列表getProhibitedResultParams(){
List prohibitedResultParams=Lists.newArrayList(super.getProhibitedResultParams());
prohibitedResultParams.add(“状态代码”);
返回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>
按
/
301
感谢您的回复。事实上已经有一张公开票了。请参见此处“结果配置文档”上的链接,该链接看起来已断开。此信息现在可在此处获得-