2011年6月20日月曜日

URLで直接アクションを起動

Webアプリケーションは通常複数のWebページを一定の順序で辿ることで一連のデータ処理を行うように設計されますが
  • ブックマークやURL直接入力によるページ呼び出し
  • 「送信」ボタン複数回クリックによるフォームデータの再送信
  • 「戻る」ボタン操作によるフォームデータの再送信
  • ページの「再読み込み」操作によるフォームデータの再送信
  • タブブラウザのセッション復元機能によるページ呼び出し
といった操作で設計とはことなる画面の流れが発生する場合があります。 Struts2では「送信」ボタン複数回クリックに対してはTokenInterceptorが用意されているので、簡単に複数回クリックを排除することができますが、URL直接入力は悪意あるユーザによるページ呼び出しの場合が多く、対策をしておく必要があります。

現在作成してアプリケーションでは対策をいろいろと施していますが、そのテストの中で以下のような問題が発生したのでメモっておくことにします。

/hoge/package/app01といったアクションを定義した場合(hogeはアプリケーション)に、通常は@Namespace("/package")で@Action(value="app01")で呼び出すことになります。 これを/hoge/app01とURLで指定した場合に、アクションとしては/hoge/package/app01が呼び出されますが、(期待値としてはエラーになって欲しかった)
  • アノテーションで定義された@InterceptorRefが処理されない。
  • アノテーションで定義された@Resultが反映されない。
といった通常とは違う動作をするようです。

ここで、表示要求に対してはCodeBehindによる画面遷移で処理されてしまいます。したがって「error」をActionの戻り値とした場合、app01-error.jspが表示されます。

とりあえず、ユーザ作成のインターセプターを利用しているので、インターセプターから呼び出されているかをアクションのexecute()で判定してエラー処理を行うことにしました。

でも、もっとスマートな判定方法はないかな?

0 件のコメント:

コメントを投稿