13

ビュー パラメータを定義する JSF2 XHTML ページがあります。これにより、ブックマーク可能な URL を持つことができます。XHTML ページには次のパラメーターが含まれます。

<f:metadata>
  <f:viewParam name="searchName" value="#{nbsearchpage.searchName}" />
  <!-- More view parameters omitted here for brevity -->
  <f:event listener="#{nbsearchpage.searchPreRender}" type="javax.faces.event.PreRenderViewEvent" />
</f:metadata>

同じページに、ユーザーが searchName を変更できるテキスト フィールドとボタンがあります。

<h:form id="some-id">
  <h:inputText value="#{nbsearchpage.searchName}" />
  <h:commandButton value="search" action="#{nbsearchpage.search}" />
</h:form>

最後に、nbsearchpage Bean のアクション メソッド search() が同じページに戻りますが、パラメータが含まれます。

?faces-redirect=true&amp;includeViewParams=true

これにより、ユーザーに適切な URL が提供されます。ユーザーが検索フィールドに「IBM」と入力すると、URL がリダイレクトされます。

?searchName=IBM 

それは完全にうまく機能します。しかし、ユーザーは searchName テキストフィールドに EL 式を入力できるようになり、EL 式が評価されます。たとえば、ユーザーがテキスト フィールドに「#{2+2}」と入力すると、URL は次の URL にリダイレクトされます。

?searchName=4

これは、セキュリティ上の理由から、ユーザーが EL 式を入力できるようにするべきではないと思います。Glassfish 3.1.1 を使用しています。

この自動 EL 解決を防ぐ方法はありますか? JSF2 のビュー パラメータの概念とリダイレクトに根本的な欠陥があると思いますか? リダイレクトに耐えられないビュー スコープで同じ問題が発生したため、独自のスコープを作成する必要がありました。(フラッシュスコープを使用することもできました)。

4

2 に答える 2

5

これを Mojarra 2.1.4 で再現できます。これは間違いなく望ましくありません。問題 2247として Mojarra 関係者に報告しました(できれば投票してください)。ちなみに、MyFaces 2.1.3 でも同じ問題が発生しています。

根本原因が JSF 実装固有のユーティリティ クラスにある限り、この特定の問題に対する単純な回避策は思い浮かびません。に変更されたコピーを簡単に作成できますが、/WEB-INF/classes実装に依存しないようにするには、完全に再実装ViewHandlerImplするかExternalContextImpl、カスタムのものとして提供する必要がありますが、それは大変な作業です。

ただし、既に を使用しているため、の代わりにおよびの代わりに<f:viewParam>使用することもできます。<form><h:form><input type="submit"><h:commandButton>

<form>
  <h:inputText id="searchName" value="#{nbsearchpage.searchName}" />
  <input type="submit" value="search" />
</form>

代わりに、レンダリング前のビュー イベント リスナーでアクション メソッドを実行します。<h:form>これは、POST 専用であるため、JSF で GET フォームを使用するより適切な方法でもあります。


具体的な問題とは無関係:

リダイレクトに耐えられないビュー スコープで同じ問題が発生したため、独自のスコープを作成する必要がありました。

生き残るリダイレクトは、ビュー スコープの意図ではありませんでした。ビュー スコープは、同じビューを操作している限り存続することを意図しています (特に Ajax およびコンテンツの条件付き再レンダリングによって)。代わりに、基本的に会話スコープを探しています。CDI@ConversationScopedまたはMyFaces CODIを見たことがあるでしょう。

于 2011-11-17T12:29:45.030 に答える
1

この問題は、MyFaces Core バージョン 2.0.11、2.1.5ではMYFACES-3405で、Mojarra バージョン 2.0.7、2.1.5、2.1.6 ではJAVASERVERFACES-2247で解決されています。

更新されたバージョンを使用するだけです。

于 2013-04-16T23:20:32.670 に答える