[Seasar-user:11992] [S2Struts]Actionクラスへのバインディングについて

Yuasa.Takahiro [E-MAIL ADDRESS DELETED]
2007年 12月 7日 (金) 23:05:26 JST


湯浅と申します。

S2Strutsでの開発に関して悩んでいるところがありまして、
皆さまのお知恵をお借りできればと思い、投稿いたしました。
 ※投稿内容について前提の環境は以下の通りです。
  ・Seasar2 2.4.17
  ・S2Struts V1.3.0-RC2 (POJO Actionクラスを使用した無設定S2Struts)
  ・Mayaa 1.1.16

S2Strutsの仕様上、
Test1Action.doXXX() → Test2Action.initialize()と遷移した場合、
Test2Actionに用意したsetterメソッドに対して、S2Strutsによりバインドが行われます。
(Test2Action.initialize()の実行には、<s2tmputs:init>タグを使用。)
バインドの優先順位は、
 1.HttpServletRequest#getParameter()
 2.HttpServletRequest#getAttribute()
 3.HttpSession#getAttribute()
です。
このため、Test1ActionからTest2ActionにRequestまたはSessionを介して値を渡そうとした場合、
HTTPパラメータに同名の値がいると、そちらが優先されてしまいます。

この動作は、思わぬ不具合の種にならないかと懸念しております。


具体的には、例えば、

@StrutsAction
public class Test1Action {

    private String tmp;

    public String doXxx() {
        tmp = "aaa";
        return TEST2;
    }

    public String getTmp() {
        return tmp;
    }
}

@StrutsAction
public class Test2Action {

    private String tmp;

    public void initialize() {
        System.out.plintln(tmp);
    }

    public void setTmp(String tmp_) {
        tmp = tmp_;
    }
}
とし、VIEWで<s2tmputs:init>タグを使用し、Test2Action.initialize()を
実行するとします。この場合、
画面1(Test1Actionの画面)の[XXX]ボタンを押下し(doXXX()を実行)、
画面2(Test2Actionの画面)へ遷移・画面を表示(initialize()を実行)
すると、標準出力に「aaa」が出力示されます。
(S2Strutsが、Requesrtを介して変数tmpの値を受け渡してくれるためです。)

次に、画面1で[XXX]ボタンを押下したときにPOSTデータをフックし、
name="tmp" value="bbb"というパラメータを追加してみます。
すると、画面2表示時に標準出力に出力されるのは「bbb」となります。

つまり、Test1Action.doXXX() → Test2Action.initialize()で受け渡す値
の名前が分かれば、上書きが出来てしまいます。(型がStringの場合のみですが。)
ちなみに、受け渡す値の型がString以外(例えば、Listなど)の場合は、
バインド時に型が合わないため、Test2Actionのtmpの値はnullとなりました。
(この場合も、tmpにTest1Actionから受け渡そうとした値が入ることは
ありませんでした。)

以上のように、Action間でRequestまたはSessionを介して値を渡すような
処理を行っている場合、その値の名前が分かれば(そんなケースは稀なのかも
しれませんが)値を上書きもしくはnullに出来てしまうと思われます。

皆さまはこれに対して何か対策を講じられておいででしょうか?

個人的には、<s2struts:init>タグで実施されるバインドの優先順位を
 1.HttpServletRequest#getAttribute()
 2.HttpServletRequest#getParameter()
 3.HttpSession#getAttribute()
に変更してはどうだろうか?と思っています。(浅はかでしょうか?)

もし、よい対策法をご存知であれば、ご教授いただけたら幸いです。


以上です。
よろしくお願いいたします。

-- 
Yuasa Takahiro



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