ダブルサブミット(二重送信)を防止しつつ、サブアプリケーションスコープのプロパティをクリアするには?

「登録」→「確認」→「完了」のinsert処理を呼び出すメソッドは、doOnce と doFinish のどちらを使うべきだろうか?


doOnceを使った場合、ダブルサブミット対策はできるが、登録完了後に、完了ページから登録ページへ行くと、登録ページに以前の入力値が残っている。これは、なんとしても避けたい。だからと言って、確認ページ内で doFinish メソッドを使うと、ダブルサブミット対策が手薄になってしまう。doOnce と doFinishの併用ができると良いが、現段階(Teeda 1.0.10)はできない。うーん、困った。


あまり、スマートなやり方ではなく、裏技っぽいが、以下のようにすると、この要件を満たすことができる。

@RemoveSession(name = "javax.faces.internal.scope.SubApplicationScope")
public Class doOnceRegister() {
...
}

※ この方法は、複数のウィンドウがあった場合、全てのウィンドウの状態を破棄するので、マルチウィンドウの場合は、うまく動作しないので、推奨できません。

RemoveSessionアノテーションは、メソッド呼び出しが終わった時点で、name属性で指定したセッションキーの値を削除するものです。この機能を使って、サブアプリケーションスコープが管理しているプロパティを全て削除することができます。


だだし、サブアプリケーションスコープのプロパティを削除したことで、変数にNullが入ることを想定していない箇所では、NullPointerException が発生してしまうので、注意する必要があります。