Apcoordinator ユーザーズガイド
目次 前ページ次ページ

第3部 Webアプリケーションの開発> 第17章 APIを使ったプログラミング> 17.1 セション管理

17.1.8 リクエストの検証

Webcoordinatorでは、不当な画面から送信されたリクエストを検出して、例外を発生させることができます。 不当な画面から送信されたリクエストを検出する方法には、ページチェック機能とリクエストの正当性検証機能があります。
注意
ボタンのダブルクリック等で2重にリクエストが送信された場合でも不当なリクエストと判定される場合があります。

■ページチェック機能

ブラウザの戻るボタンや、キャッシュ内の画面で実行することによって、予期しないページからのリクエストが実行される場合があります。 ページチェック機能では、これを検出して例外を発生させることができます。
・使用方法

ページチェック機能を利用する場合には、以下の手順でアプリケーションを作成します。

1) セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、高度なセション管理を参照してください。

2) HttpControlStateProfileクラスのisPageCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。


    public boolean isPageCheckEnabled() {
        return true;
    }

サーバが最後に送信したページ以外からのリクエストの場合は、ControlStateExceptionがスローされます。 これを判定して別の処理をする場合はセションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
注意
セション開始前または破棄後の場合、本機能は無効となります。

■リクエストの正当性検証機能

不当な画面から送信されたリクエストによって、実行すべきでないビジネスクラスのメソッドが実行されてしまう可能性があります。 リクエストの正当性検証機能では、この不当なリクエストを検出して例外を発生させることができます。

以下の図は、画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実行されてしまう例です。

  1. 画面1を表示します。
  2. 画面2に遷移せずに、画面3で送信されるリクエストを画面1から送信します。
  3. 画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実行されてしまいます。
不当なリクエストの検出
Webcoordinatorは、リクエストからコマンド名(uji.verb)と入力データBean情報(uji.beanまたはuji.id)を取得し、コマンドマップを参照してビジネスクラスのメソッドを呼び出します。リクエストの正当性検証機能では、これらの情報を用いて不当な画面から送信されたリクエストを検出します。
不当な画面から送信されたリクエストの場合は、IllegalRequestExceptionがスローされます。 これを判定して別の処理をする場合はセションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
・使用方法

リクエストの正当性検証機能を利用する場合には、以下の手順でアプリケーションを作成します。

1) セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、高度なセション管理を参照してください。

2) HttpControlStateProfileクラスのisRequestCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。


    public boolean isRequestCheckEnabled() {
        return true;
    }
3) 入力フォームに使用するタグによって以下のとおり異なります。

3-1) uji:formタグを使用する場合
uji:formタグのverbsアトリビュートに、このフォームから発生するコマンド一覧を指定します。

   <uji:form name="myform" verbs="button1,button2" beanId="body">
     ....
     <INPUT TYPE="SUBMIT" NAME="button1" VALUE="ボタン1">
     <INPUT TYPE="SUBMIT" NAME="button2" VALUE="ボタン2">
   </uji:form>
上記では、フォームから発生するコマンド一覧として「button1,button2」を指定しています。
3-2) HTMLのFORMタグを使用する場合
ビジネスクラスのメソッド内でHttpControlStateProfileクラスのaddNextCommandsメソッドを使用して、ウィンドウ名、コマンド名(uji.verb)および入力データBean情報(uji.beanまたはuji.id)を設定します。 addNextCommandsメソッドの詳細は、APIリファレンスを参照してください。

    package sample;
    import com.fujitsu.uji.http.HttpDispatchContext;

    public void someHandler(DispatchContext context, sample.MyDataBean dataBean) {
        SampleSession session = (SampleSession)context.getSessionProfile();
        String[] commends = {"button1", "button2"};
        session.addNextCommands((HttpDispatchContext)context, "winName", "subBody", null, commends);
        ...
    }
上記では、ウィンドウ名「winName」、uji.idの値「subBody」、コマンド名「button1」と「button2」を指定しています。
以下のような入出力ページを使用している場合も、addNextCommandsメソッドを使用してウィンドウ名、コマンド名(uji.verb)および入力データBean情報(uji.beanまたはuji.id)を設定する必要があります。

注意
リクエストの正当性検証機能を利用する場合の注意事項は以下のとおりです。

目次 前ページ次ページ

All Rights Reserved, Copyright © 富士通株式会社 2000-2007