セッションの使い方

俺だったら JavaStruts を使ってフレームワークを構築する場合、RequestProcessor の頭に相当する様な場所で、セッションインスタンスに対して synchronized したいと思うんだけど、今まで見て来た職場って何処もそういう事はしてないんだよなあ…。恐くないのかなあ…。だってそれをやらないって事は、あるスレッドがセッションインスタンスの中身を書き換えてる最中に、別のスレッドがセッションインスタンスの中身を読み取って DB を更新しちゃうって事なんですよ。そうでしょ。それって胃がキリキリするぐらいに気を使いながらセッションを使わなくちゃいけない気がするんだけどなあ…。というか気付いてないだけな気がするんだけど…。
ワンタイムトークンチェックを全てのアクセスに対して行うのなら、話は違って来るけど。その場合はワンタイムトークンチェックで同時にセッションにアクセスするのを防げる。でも全アクセスに対してワンタイムトークンチェックをやるとブラウザの「戻る」ボタンとかが殆ど使えなくなって、可也不便な事にはなるんだよな。でも俺はセッションに色々と持つのなら全アクセスでやるべきだと思うんだよな。例えば「確認画面(トークン発行)」→「更新画面(トークン確認)」ってだけの流れの場合、「確認画面(トークン発行)」→「編集画面(トークン処理無しでセッションの中身を書き変える)」→「更新画面(トークン確認)(正しいトークンの値を javascript を利用する等々の方法で渡す)」って方法でアクセスされたら、不正な値で DB が更新される可能性があるんだよ。バリデーションは編集画面だけでやるからさ。確認画面でセッションの中身に対してバリデーションって普通はしないと思うから。
つーかアレなんだよ。この辺りの方式の決定って非常に悩ましいんだよな。俺も色々な職場で色々なやり方を見て来た訳だけど。セッションに情報を持つとか持たないとか。ワンタイムトークン処理を部分的に行うとか全部で行うとか。利便性を最大化するとか制限するとか。プログラムの実装を単純化するとか複雑化するとか。セッションに持たずに全て hidden で持つとか。バリデーションは編集と確認と更新の全てで行うとか行わないとか。複数 Window での操作を許可する為にセッションで面倒なメモリ管理を行うとか。ある部分を立てるとある部分はダメになるけどある部分は立つ事が出来るみたいなのが、若干パズル的になる感じなんだよな…。考え抜いた事は無いんだけど。
中途半端な理解の奴がフレームワークを作ったり、客の要望で当初よりもリッチなのを途中で目指してたりすると、大体の場合で何らかの穴が空いていたりするんだけど、そういうのは流石に俺も無視するよ。だって俺の胃に穴が空きそうだし…。俺って粗全ての仕事が中途参加で中途退場だから、そういうのを嗅ぎ取る力は平均以上だとは思ってるよ。
あー間違えてた。更新処理でセッションの中身をバリデーションしないで済ます為には、全てのアクセスでトークンチェックをするだけでは足りない。それに加えて更新処理にアクセスする直前にアクセスされていなくてはならない処理をサーバ側で管理する必要がある。そういう画面遷移に関する情報をサーバに持たないといけないし、チェック処理も必要になる。それらが満たされて初めて更新処理でセッションの中身のバリデーションをしなくても良くなる。
注意したいのは、アクションで処理を終えた後に JSP や Velocity 等々にフォワードした際に、JSP や Velocity でもセッションの中身にアクセスしている事が普通なので、その部分に関しても排他をしてやらないと拙いって事。RequestProcessor の頭で synchronized すればその辺りまで纏めて排他が出来た筈…。ダメならフィルタで synchronized しないとなあ。
ワンタイムトークンチェックだけで JSP や Velocity までの排他をしたい場合は、JSP や Velocity の最後の方にトークンを書く事。その後ろにセッションインスタンスへのアクセスは書かない事。俺のサーブレットJSP や Velocity の理解が間違って無ければの話…。サーブレットって出力ストリームに書き込んだら、その度に直ぐにソケット経由でクライアントに飛ばすんだよね、恐らく…。全ての書き込みをバッファに受け取ってから、処理の終了を契機に一気にクライアントに飛ばす訳では無いよね。バッファに受け切ってからクライアントに飛ばすのであれば、ワンタイムトークンを最後の方に書く必要は無くなる。
でもダウンロードが出来なくなっちゃうんだよな、オールワンタイムトークンチェックだと…。でもダウンロード用のワンタイムトークンも合わせて発行すれば問題無いのか。ダウンロード用と画面用を発行する感じで。ダウンロードボタンはクリックした途端に非活性にする。