struts2 の tokenSession は、トランザクショントークン処理を行ってくれます。
しかも、トークンが無効の場合に、セッションに保存したValueStackを再生し、result処理を行ってくれます。
二重ポストや、CSRFを防ぐことができて、なおかつ、エラー画面ではなく結果の画面も表示してくれるのでとても便利です。
しかーし、ここに落とし穴がありました。
セッションには、ValueStackのみならず、ActionInvocation を丸ごと保存しています。
この中には、java.io.Serializable が実装されていないオブジェクトがたくさんあります。
しかも、struts2で生成されたオブジェクトだけならまだしも、HttpServletRequest や、HttpServletRequest、ServletContextなど、 struts外で作られるオブジェクトもSerializableではないんですね。
実際に、この機能を利用してセッションに ActionInvocation が保存された状態で tomcat を再起動すると、NotSerializableException が出まくります。
現時点では tomcat をクラスタ構成している場合などセッションの保存が必要な構成では、tokenSession は使えない、ということになると思います。
フツウのtoken に戻すしかないか・・・。


