[Seasar-user:11178] Re: ボタンを1回押したら「二重サブミットされました」

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 10月 20日 (土) 18:00:39 JST


小林 (koichik) です.

Date:    Sat, 20 Oct 2007 13:08:53 +0900
From:    Junichi Kato <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:11177] Re: ボタンを1回押したら「二重サブミットされました」

> 同じトークンが2回続けてきているから発生しているのでしょうか?

そうです.
サーバ側から見ると同じボタンが押されたように見えます.
通常 POST だとキャッシュされず,

1.リンクをクリック
   ↓ GET
2.a.html
   ↓ POST doOnceXxx()
3.a.html (自画面遷移)
   ↓ POST doOnceXxx()
4.a.html (自画面遷移)

のようになるはずです.

しかし,doOnce〜() が return null でなく,
return Xxx.class になっているならそれは
キャッシュの影響を受けます.
もしキャッシュされなければ

1.リンクをクリック
   ↓ GET
2.a.html
   ↓ POST doOnceXxx()
3.リダイレクト
   ↓ GET
4.a.html
   ↓ POST doOnceXxx()
5.リダイレクト
   ↓ GET
6.a.html

となりますが,キャッシュが効いて 3 の
リダイレクトに対して GET のリクエストがされず,
4 は 2 でキャッシュされた HTML が使われると
辻褄が合います.

1.リンクをクリック
   ↓ GET
2.a.html
   ↓ POST doOnceXxx()
3.リダイレクト
   ↓ (GET しない)
4.a.html (キャッシュされてた 2 の HTML)
   ↓ POST doOnceXxx()
5.二重サブミットエラー

油断してましたが,[Seasar-11173] のログの最初の
リクエストが PRG の GET になってるのでこれで確定?
だとすると [Seasar-user:11163] のサンプルで再現
するはずはないのですけどね.return null だから.

対策としては <meta> 等でキャッシュを防ぐことに
なるんじゃないかと.
レスポンスヘッダで制御するなら prerender() で
やるのかも.

返事がないから真相は不明ですが,[Seasar-user:10943]
のような現象もキャッシュ絡みだと思われるので,
PRG するならキャッシュの影響は考慮が必要ですね.
この辺は Teeda としてももっとアピールが必要かも.



-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>




Seasar-user メーリングリストの案内