3

我有一个 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在工作流程中注入这个自定义。

任何帮助表示赞赏。

更新 我已经在下面发布了答案。

4

2 回答 2

4

在结果处理过程中,它看起来statusCode没有从参数列表中删除。

要使用您自己的结果类型,只需将其定义为任何其他结果类型并使用它来代替redirectAction. 这在结果配置文档中进行了讨论。您应该能够覆盖getProhibitedResultParams()并添加statusCode到列表中。

IMO statusCode 应该在该列表中。已经有一张JIRA 票了

于 2013-02-02T21:05:23.327 回答
0

如果有人和我有同样的问题,这就是我根据戴夫的回答解决的方法。

首先在您将调用此结果类型的包中声明结果类型。

    <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>
于 2013-02-04T19:13:44.913 回答