3

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ただし、これにより、最終的にリダイレクトされる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。しかし、私はそれが私が正確に望んでいるものだとは思いません。redirectedToページのコンテンツ(新しいリンク)と一緒に301を送信する必要があるため。

サブクラス化してから禁止リスト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

誰かが私と同じ問題を抱えている場合、これが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>
于 2013-02-04T19:13:44.913 に答える