7

私は、RESTfulURLを必要とするseamでプロジェクトを行っています。/ group / {group}/{locale}にマップされているビューがあります。そのページには、いわゆるメッセージのリストがあります。各メッセージには、メッセージへの変更を保存するためのボタンがあります。これは、次のようなアクションBeanにリンクされています。

<h:commandButton type="submit" value="Save Changes" action="#{groupAction.update}" />

各メッセージにはアンカーがあるため、/ group / {group} / {locale}#{id}を使用して、ブラウザをそのアンカーに移動させることができます。これが、POSTの後にリダイレクトが必要な理由です。

<page view-id="/group.xhtml">
  <rewrite pattern="/group/{group}/{locale}"/>

  <param name="group" value="#{groupAction.group}"/>
  <param name="locale" value="#{groupAction.locale}"/>

  <navigation from-action="#{groupAction.update}">
    <redirect view-id="/group.xhtml?group=#{group}&locale=#{locale}##{id}"/>
  </navigation>
</page>

また、適切なRESTful URLに到達するための次のリダイレクトルール(UrlRewriteFilter)があります。

<outbound-rule>
  <from>^/group.xhtml\?group=([\.\w]+)&locale=([\.\w]+)\#([\.\w]+)\?cid=(\d*)$</from>
  <to type="temporary-redirect" last="true">/group/$1/$2#$3</to>
</outbound-rule>

ここでconversationIdを削除します。これは作品をテストしました。ただし、seamは引き続き'?conversationId={cid}'を追加します。だから問題は何ですか?'/ group / {group} / {locale}#{id}?conversationId={cid}'のようなURLを想像してみてください。明らかに、ブラウザはこれを嫌い、自動的にそのアンカーに移動しません。

私はいくつかの調査を行い、シームのドキュメントで自分の問題を発見しました。

29.1.4.2。リダイレクトを使用した会話の伝播 このフィルターを使用すると、Seamはブラウザーのリダイレクト間で会話コンテキストを伝播できます。ブラウザのリダイレクトをインターセプトし、Seam会話識別子を指定するリクエストパラメータを追加します。リダイレクトフィルターはデフォルトですべてのリクエストを処理しますが、この動作はcomponents.xmlで調整することもできます。

<web:redirect-filter url-pattern="*.seam"/>

私はredirect-filterを必要とせず、フィルターを「無効にする」ためにurl-patternに無効なものを入れてみました。しかし、それはうまくいきませんでした。だから私の質問は今です:

シームでリダイレクトフィルターを無効にするにはどうすればよいですか?

答えが見つかりません。シームのドキュメントでは、web.xmlでそれを無効にすることについて説明していますが、私の試みはまだ成功していません。

4

2 に答える 2

7

不要なconversationIdクエリ文字列パラメータがどこから来ているのかを調べました。

結果はへの<redirect/>呼び出しになりますorg.jboss.seam.faces.FacesManager.redirect(String viewId, Map<String, Object> parameters, boolean includeConversationId)

これは、trueorg.jboss.seam.faces.Navigatorに設定されている次のコードから呼び出されます。includeConversationId

  FacesManager.instance().redirect(viewId, parameters, true);

これを回避する方法がわからないため、修正/回避策は、アクションメソッドでプログラムでリダイレクトを実行することです。

  FacesManager.instance().redirect(viewId, parameters, false);
于 2009-01-13T15:53:53.217 に答える
1

OK、これをcompononents.xmlに追加することで、redirect-filterを強制終了できました。

<web:redirect-filter disabled="true" installed="false" />

しかし、私の主な問題はまだ存在しているので、それは明らかに問題ではありませんでした。それでも、conversationIdをURLの追加のクエリ文字列として追加します。以前に行われたことがあるので、どうやら私は何か間違ったことをしています。

@Adeel Ansari:

components.xml:

 <web:rewrite-filter view-mapping="/seam/*" />

pages.xmlは私の最初の質問を参照してください。

于 2009-01-12T09:05:08.440 に答える