ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

F.4.4 ボタンの多重押下による二重処理を防止したい

ブラウザの画面でボタンを何度か押した場合に、サーバへのリクエストが複数回発行されます。このとき、処理が二重に実行されることを防止する機能をApcoordinatorは提供しています。

二重処理を防止する機能にはブラウザ側で処理するものと、サーバ側で処理するものがあります。

2つの機能の長所、短所を比較すると以下のようになります。

ブラウザ側で二重処理を防止する

uji:formタグでフォームを作成し、postOnceアトリビュートに"true"を指定します。

<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body" beanCls="my.pkg.MyDataBean">
  商品コード: <INPUT NAME="code"><BR>
  個数:       <INPUT NAME="count"><BR>
  <INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">           
  <INPUT TYPE="SUBMIT" NAME="cancel" VALUE="キャンセル"> 
</uji:form>

postOnce="true"を指定した場合、ブラウザの読み込みが中断されたあとでも二重処理防止機能が有効になっています。そのため、次の画面が表示される前に読み込み停止ボタンなどを押して送信処理を中断し、そのあとで送信ボタンを押した場合はフォームが送信されません。このような状態に備えて、postOnce="true"の指定の有無にかかわらずフォームの送信できる送信ボタンを作成できます。送信ボタンをuji:pushButtonタグで作成し、skipScript="true"を指定してください。

<uji:form name="order" method="post" postOnce="true" verbs="ok,cancel" beanId="body" beanCls="my.pkg.MyDataBean">
  商品コード: <INPUT NAME="code"><BR>
  個数:       <INPUT NAME="count"><BR>
  <INPUT TYPE="SUBMIT" NAME="ok" VALUE="決定">           
  <uji:pushButton type="submit" name="cancel" label="キャンセル" skipScript="true" /> 
</uji:form>

skipScript="true"の指定は、フォーム送信時のJavaScriptの実行を抑止するための機能です。この指定のあるボタンが押された場合は、二重処理を防止するJavaScriptだけでなく、入力値をチェックするJavaScriptも実行されません。

サーバ側で二重処理を防止する

サーバ側で二重処理を防止するには、アプリケーションを以下のように作成します。

この2つを順に説明します。

ユーザ定義のセションクラスをcom.fujitsu.uji.http.HttpControlStateProfileクラスを継承して作成します。また、isDoublePostEnabled メソッドをオーバライドしてfalseを返却するようにします。このメソッドは、二重処理を認めるかどうかを指定するものです。

public class SampleSession extends com.fujitsu.uji.http.HttpControlStateProfile {

    public boolean isDoublePostEnabled() {
        return false;
    }
}

なお、ユーザ定義のセションクラスを有効にするために、以下の作業が必要になります。具体的な方法は“3.5 ファクトリクラス”を参照してください。

以下のように、すべてのフォームにuji:controlStateタグを追加します。

<uji:form ...>
   <uji:controlState />
   ...
</uji:form>

注意

サーバ側で二重処理を防止する場合、セションが開始されてから破棄されるまで有効です。セションが開始される前または破棄されたあとは機能が無効になります。

関連項目