Java 在Struts2中,如何在URL中不显示参数的情况下执行永久重定向(状态代码301)

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

我有一个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>  
这不起作用。我仍然得到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

感谢您的回复。事实上已经有一张公开票了。请参见此处“结果配置文档”上的链接,该链接看起来已断开。此信息现在可在此处获得-