[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 メーリングリストの案内