[Seasar-user:14802] Re: [Teeda] 二重サブミットについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 6月 24日 (火) 16:30:32 JST


小林 (koichik) です.

Date:    Tue, 24 Jun 2008 13:33:47 +0900
From:    松崎 学 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:14797] Re: [Teeda] 二重サブミットについて

> 03_server2.logと04_server2.logの間のログを添付します。

ありがとうございます.原因が分かりました.
Teeda では windowId は static に持っている
カウンタをインクリメントしながら割り当てています.
このカウンタは 0 から始まるため,複数のサーバで
同じ値が割り当てられることがあります.

今回の場合,

> 01_server1.log ⇒ 初期表示

でサーバ 1 で windowId=1 が割り当てられ,

> 3. 呼び出し元画面でAjax検索。

こちらではサーバ 2 で windowId=1 が割り当てられて
しまい,Ajax 呼び出しのサブアプリケーションが
ポップアップでの検索のサブアプリケーションとは
異なることから,それまでのサブアプリケーション
スコープが消されてしまったというのが原因です.

サーバ起動直後に一連の操作を行い,ポップアップの
初期表示と元画面での Ajax 検索が別のサーバに
割り当てられれば再現するはずです.

スティッキーが効いていれば同じ HTTP セッションは
同じサーバに割り当てられるので windowId が重複
することもないため,この問題に遭遇した人が
いなかったということなのでしょう.

対策として windowId には乱数を使い,HTTP セッション内で
重複がないかチェックするようにしたいと考えています.
他にも HTTP セッションが複数のサーバで処理された
場合にウィンドウ単位の情報を失う危険性があるので,
一通り見直してから Teeda 1.0.13-sp2-rc1 を出します.

とりあえず,カウンタの初期値を currentTimeMillis() に
したソースを添付するので,これをソースフォルダの
javax.faces.internal パッケージに置いて凌いでください.
サーバの起動時間が 1 秒違えばウィンドウ 1000 枚は
重複しないはずです.
# ひどい対策だ.(^^;


-- 
<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>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: WindowIdUtil.java
Type: application/octet-stream
Size: 2744 bytes
Desc: 無し
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20080624/0a783fbc/attachment-0001.obj>


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