SessionToken を利用する Action は Serializable に。

 

SessionToken の内部処理を調べる機会があったので、備忘録として書いておきます。
SessionToken は hidden で渡ってきた、token と Session 上の token を比較し、同じであれば処理を続行します。
違っている場合、処理対象のアクションが過去に実行されていなければ、 token.invalid のエラーになりますが、過去に実行されていれば、 そのアクションの処理を実行せず、ページだけを再表示します。

処理対象のアクションやモデルは Serializable でなければならないようです。
その理由は、ActionInvocation を丸ごと session に put しているからでした。
そのコードは、struts-core-2.1.x.jar のここにありました。
org.apache.struts2.util.InvocationSessionStore#setInvocationMap

そもそも ActionInvocation は、 Serializable なインターフェイスで、その中に持っているメンバも全部 Serialize じゃないと意味がありません。
そういう意味では、アクションやモデルはすべて Serializable にした方がよかったとちょっと後悔してます。
しかし、Serializable ってEclispseで生成してくれるとはいえ、その機構自体メンドクサイ。
こんなのJava側で自動でやってくれないのかな・・・といつも思ってしまいます。