Webcoordinatorでは、不当な画面から送信されたリクエストを検出して、例外を発生させることができます。 不当な画面から送信されたリクエストを検出する方法には、ページチェック機能とリクエストの正当性検証機能があります。
注意
ボタンのダブルクリック等で2重にリクエストが送信された場合でも不当なリクエストと判定される場合があります。
ページチェック機能
ブラウザの戻るボタンや、キャッシュ内の画面で実行することによって、予期しないページからのリクエストが実行される場合があります。ページチェック機能では、これを検出して例外(エラーコード UJI055)を発生させることができます。
ページチェック機能を利用する場合には、以下の手順でアプリケーションを作成します。
セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、“15.1.5 高度なセション管理”を参照してください。
HttpControlStateProfileクラスのisPageCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。
public boolean isPageCheckEnabled() { return true; }
サーバーが最後に送信したページ以外からのリクエストの場合は、ControlStateExceptionがスローされます。これを判定して別の処理をする場合はセションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
注意
セション開始前または破棄後の場合、本機能は無効となります。
リクエストの正当性検証機能
不当な画面から送信されたリクエストによって、実行すべきでないビジネスクラスのメソッドが実行されてしまう可能性があります。リクエストの正当性検証機能では、この不当なリクエストを検出して例外を発生させることができます。
以下の図は、画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実行されてしまう例です。
画面1を表示します。
画面2に遷移せずに、画面3で送信されるリクエストを画面1から送信します。
画面3からリクエストが送信された場合に実行されるビジネスクラスのメソッドが、画面1から送信されたリクエストによって実行されてしまいます。
Webcoordinatorは、リクエストからコマンド名(uji.verb)と入力データBean情報(uji.beanまたはuji.id)を取得し、コマンドマップを参照してビジネスクラスのメソッドを呼び出します。リクエストの正当性検証機能では、これらの情報を用いて不当な画面から送信されたリクエストを検出します。
不当な画面から送信されたリクエストの場合は、IllegalRequestExceptionがスローされます。これを判定して別の処理をする場合はセションクラスまたはアプリケーションクラスのhandleExceptionメソッドに記述します。
リクエストの正当性検証機能を利用する場合には、以下の手順でアプリケーションを作成します。
セションクラスをHttpControlStateProfileから継承します。HttpControlStateProfileクラスについては、“15.1.5 高度なセション管理”を参照してください。
HttpControlStateProfileクラスのisRequestCheckEnabledメソッドをオーバライドしてtrueを復帰するようにします。
public boolean isRequestCheckEnabled() { return true; }
入力フォームに使用するタグによって以下のとおり異なります。
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)を設定する必要があります。
同一ウィンドウ内でuji:formタグとHTMLのFORMタグを混在して使用している。
この場合、uji:formタグで指定された情報にaddNextCommandsメソッドで設定したウィンドウ名、コマンド名(uji.verb)および入力データBean情報(uji.beanまたはuji.id)が追加されます。
ファイルのアップロード機能、ファイルのダウンロード機能を利用している場合で、入力フォームにHTMLのFORMタグを使用している。
uji:anchorタグをフォーム指定モードで使用し、formアトリビュートでHTMLのFORMタグのフォーム名を指定している。
サブウィンドウまたはフレームで画面が複数ある場合で、入力フォームにHTMLのFORMタグを使用している画面が存在している。
注意
リクエストの正当性検証機能を利用する場合の注意事項は以下のとおりです。
セション開始前、セション破棄後またはセションタイムアウト後の場合、本機能は無効となります。
リクエストの正当性検証機能とページチェック機能の組み合わせで、ブラウザの戻るボタンやキャッシュ内の画面からのリクエストが送信された場合の動作を以下に示します。
リクエストの正当性検証機能 | ページチェック機能 | 動作 |
---|---|---|
有効 | 有効 | リクエストの正当性検証機能とページチェック機能の併用ができます。検証順は以下のとおりです。
|
無効 | リクエストの正当性検証機能が有効になります。 | |
無効 | 有効 | ページチェック機能が有効になります。 |
無効 | リクエストの検証をおこないません。リクエストの正当性検証機能、ページチェック機能とも無効になります。 |
タイムアウト後の画面からリクエストが送信された場合でも例外(IllegalRequestException)が発生します。