- - PR -
Tomcatのクラスタ環境でのStrutsの同期トークンについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-10-15 03:51
Tomcatでのクラスタ環境でのStrutsの同期トークンについて相談です。
■環境 JDK1.5 Struts1.2.9 Tomcat 5.5.20 Apache2系(予定) 現在、Tomcat5.5/mod_jk2のグループクラスタリングを想定して 開発環境を構築していますが、Apache側はまだ未着手です。 セッションの同期方法についてはデルタマネージャを使用しています。 ロードバランサについては、 各グループに対してはスティッキーセッション、 グループ内のメンバに対してはラウンドロビンで考えております。 クラスタはグループ内のみで行う想定です。 ■前提 StrutsのAction#saveTokenやAction#isTokenValidの実装を見る限り、 単一のJVMでは問題なさそうに見えますが、 (経験上、今まで単一のJVMの場合では問題なかった) クラスタ環境で多重リクエストを別々のJVMで受け付けた場合に、 Action#isTokenValidの戻り値が、それぞれのリクエストでtrueを返すように見えます。 (非クラスタ環境では、最初のリクエストのみtrueが返る) Strutsの同期トークンについては検証していませんが、 JVM間でのセッションが同期されるタイミングについては、確認を行っておりまして、 セッションの同期タイミングとStrutsのソースを読んだ結果、 上記問題が発生すると考えました。 (レスポンスが返される直前まで、セッションが同期されない) ■本題 同期トークンの実装が現状ではセッションを利用していますが、 JDBC経由で行うように変更すれば確実ではないかなと思っています。 そこで、クラスタ環境のTomcat/Strutsの実装を 経験されたことがある方がいらっしゃいましたら、 どのように対処されたかを是非教えていただけないでしょうか? もっといい解決方法がないかと思っています。 長々とすいませんが、よろしくお願いします。 | ||||
|
投稿日時: 2006-10-16 09:58
私も以前にほぼ同じ環境で開発を行いました。
(Tomcat5.5.9、Struts1.2.8でしたが…)
同期トークンの生成をDBで行い、それが一意になるのであれば確実だと思います。 ですが、もし同期トークンの格納先をセッションからDBに変えるだけであれば確実ではありません。 Strutsの同期トークン生成のソースを見たところセッションIDと現在時刻(前回アクセスと同一時刻なら+1)を利用しています。 そのため複数のJVMを利用する場合、同期トークンが重複する恐れがあります。 私の場合は、対象とするクライアントが限られていましたので、 全く同一時刻に同じセッションIDでリクエストするのは悪意のあるユーザぐらい と判断しこの問題を放置してしまいました。 幸いにも多重送信されても送信したユーザしか困らない仕様だったので… なんだかまともな解決策でなくて申し訳ないです。 | ||||
|
投稿日時: 2006-10-16 10:26
お返事ありがとうございます。
これから組もうと思っていたのですが、時刻までは考慮していませんでした。 情報ありがとうございます。 外向けのシステムですので、どう対応しようか正直悩みどころです。 極端な話、同期トークンを使わない実装も考えています。 Ajaxを使うので、JavaScriptが有効でなければ動かないシステムですが、 JavaScriptで2度押しをブロックして、 「無理やりでも多重送信すれば、レコードが重複して困るのは本人でしょ?」 っていうポリシーもありかなと。 |
1