- PR -

Tomcatのクラスタ環境でのStrutsの同期トークンについて

1
投稿者投稿内容
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 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の実装を
経験されたことがある方がいらっしゃいましたら、
どのように対処されたかを是非教えていただけないでしょうか?
もっといい解決方法がないかと思っています。


長々とすいませんが、よろしくお願いします。
ykSiR
会議室デビュー日: 2006/10/03
投稿数: 16
投稿日時: 2006-10-16 09:58
私も以前にほぼ同じ環境で開発を行いました。
(Tomcat5.5.9、Struts1.2.8でしたが…)


引用:

かつのりさんの書き込み (2006-10-15 03:51) より:
同期トークンの実装が現状ではセッションを利用していますが、
JDBC経由で行うように変更すれば確実ではないかなと思っています。


同期トークンの生成をDBで行い、それが一意になるのであれば確実だと思います。

ですが、もし同期トークンの格納先をセッションからDBに変えるだけであれば確実ではありません。

Strutsの同期トークン生成のソースを見たところセッションIDと現在時刻(前回アクセスと同一時刻なら+1)を利用しています。
そのため複数のJVMを利用する場合、同期トークンが重複する恐れがあります。


私の場合は、対象とするクライアントが限られていましたので、
全く同一時刻に同じセッションIDでリクエストするのは悪意のあるユーザぐらい
と判断しこの問題を放置してしまいました。
幸いにも多重送信されても送信したユーザしか困らない仕様だったので…

なんだかまともな解決策でなくて申し訳ないです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-10-16 10:26
お返事ありがとうございます。

引用:

ですが、もし同期トークンの格納先をセッションからDBに変えるだけであれば確実ではありません。

Strutsの同期トークン生成のソースを見たところセッションIDと現在時刻(前回アクセスと同一時刻なら+1)を利用しています。
そのため複数のJVMを利用する場合、同期トークンが重複する恐れがあります。



これから組もうと思っていたのですが、時刻までは考慮していませんでした。
情報ありがとうございます。


外向けのシステムですので、どう対応しようか正直悩みどころです。
極端な話、同期トークンを使わない実装も考えています。
Ajaxを使うので、JavaScriptが有効でなければ動かないシステムですが、
JavaScriptで2度押しをブロックして、
「無理やりでも多重送信すれば、レコードが重複して困るのは本人でしょ?」
っていうポリシーもありかなと。
1

スキルアップ/キャリアアップ(JOB@IT)