6

以下に示すような非常に単純な JSF Bean があります。

import org.jboss.seam.annotations.Name;

@Name(Sample.NAME)
public class Sample {

    public static final String NAME="df";

    private String text = "text-test";

    public void sampleM(){
        System.out.println("Test: "+text);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

そして、このコンポーネントに接続された JSF フォーム:

<h:form id="sampleForm">
        <h:commandButton id="sampleButton" action="#{df.sampleM()}" value="ok" />
</h:form>

ここで、このフォームに POST リクエストをプログラムで送信したいと思います。

私の調査によると、ここで重要なのは POST パラメータです。適切に選択すると、適切な結果が得られます (文字列 'Test: text-test' がサーバーのコンソールに出力されます)。

問題は、正しい POST データをどのように選択すればよいかということです。

上記の JSF フォームは、次の HTML フォームを生成します。

<form id="sampleForm" name="sampleForm" method="post" action="/pages/main/main.smnet" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="sampleForm" value="sampleForm" />
    <input id="sampleForm:sampleButton" type="submit" name="sampleForm:sampleButton" value="ok" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id65" autocomplete="off" />
</form>

したがって、これらのパラメータは正しいです。

しかし、どのパラメーター (名前と値) が他のコンポーネントに十分かを知るにはどうすればよいでしょうか?

例: 表示されている HTML フォームと同じように POST データを送信すると、'javax.faces.ViewState' パラメータ値が異なり、コンポーネント メソッドは実行されません。

4

1 に答える 1

13

java.net.URLConnection基本的に、Apache HttpComponents Clientなどの HTTP クライアントを使用して JSF フォームをプログラムで送信する方法を尋ねていることは理解しています。

JSESSIONID最初に GET リクエストを送信し、リクエスト間で同じ HTTP セッション (基本的には Cookie) を維持する必要があります。HTTP クライアントSet-Cookieが最初の GET 要求の応答からヘッダーを抽出し、そこから Cookie を取得して、後続の POST 要求のヘッダーJSESSIONIDとして送り返すようにします。Cookieこれにより、サーバー側で HTTP セッションが維持されます。それ以外の場合、JSF はそれを「View Expired」として扱います。適切に構成された JSF Web アプリケーションでは HTTP 500 エラー ページが返されるか、正しく構成されていないViewExpiredExceptionJSF Web アプリケーションでは次のように動作します。ページの更新。

javax.faces.ViewStateJSF のステートフルな性質と暗黙の CSRF 攻撃防止の一環として、クライアントが最初の GET 要求で自分自身を取得したため、有効な値でフォームを送信する必要があります。name=valueまた、他のすべての非表示フィールドのペア、特に送信ボタンのペアも送信する必要があります。

したがって、最初の GET リクエストでこの HTML が返された場合

<form id="sampleForm" name="sampleForm" method="post" action="/pages/main/main.smnet" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="sampleForm" value="sampleForm" />
    <input id="sampleForm:sampleButton" type="submit" name="sampleForm:sampleButton" value="ok" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id65" autocomplete="off" />
</form>

次に、それを解析して (これにはJsoupが役立つ場合があります)、次の要求パラメーターを抽出する必要があります。

  • sampleForm=sampleForm
  • sampleForm:sampleButton=ok
  • javax.faces.ViewState=j_id65

最後に、/pages/main/main.smnet正確にそれらの要求パラメーター (およびJSESSIONIDCookie!) を使用して POST 要求を送信します。ただし、注意してください。(下手な) JSF 開発者がたとえばid="sampleButton"からスキップした可能性が<h:commandButton>あり、JSF はこの形式のように見えるものを自動生成しますsampleForm:j_id42。サーバー側ツリー内のコンポーネントの位置に応じて値が変化する可能性があるため、それらをハードコードすることはできません。取得した HTML を実際に解析する必要があります。

それにもかかわらず、サイトの所有者/管理者に連絡して、考えていたタスクに使用できる Web サービス API がないかどうか尋ねるのが賢明です。HTML フロントエンドに JSF アプリケーションを使用する適切な Java EE Web サイトは、通常、REST フロントエンドに別の JAX-RS アプリケーションも使用します。HTML ドキュメントをスクレイピングするよりも、このような Web サービス API を介して情報を抽出する方がはるかに簡単で信頼性があります。

以下も参照してください。

于 2012-08-29T12:06:29.723 に答える