Spring Boot セキュリティ関連

Spring BootでPRGパターンを利用してみた

PRGパターンの「PRG」は「Post&Redirect&Get」の略で、Postした後でリダイレクトして画面表示するパターンのことをいう。PRGパターンを利用すると、ブラウザを再度読み込んだ場合に再度サブミット処理が実行されるのを防ぐことができる。

PRGパターンを利用しない場合、以下のように、登録完了後に「最新の情報に更新(F5)」ボタンを押下すると、「フォームを再送信しますか?」というダイアログが表示され、そこで「再試行」を押下すると再度登録処理が行われる。

1) PRGパターンを利用しない登録画面に遷移し、下記のように入力後、「登録」ボタンを押下
PRGパターンサンプル_1

2) 下記画面が表示され、登録データが一覧下に確認される。ここで「最新の情報に更新(F5)」ボタンを押下
PRGパターンサンプル_2

3)「フォームを再送信しますか?」というダイアログが表示されるため、「再試行」ボタンを押下
PRGパターンサンプル_3

4) 下記画面が表示され、登録処理が再度行われたことが確認できる
PRGパターンサンプル_4

他方、PRGパターンを利用した場合、以下のように、登録完了後に「最新の情報に更新(F5)」ボタンを押下すると、「フォームを再送信しますか?」というダイアログが表示されず、再度の登録処理は行われない。

5) PRGパターンを利用する登録画面に遷移し、下記のように入力後、「登録」ボタンを押下
PRGパターンサンプル_5

6) 下記画面が表示され、登録データが一覧下に確認される。また、リダイレクトして新しい画面を表示しているため、登録フォームの値は全てクリアされる。ここで「最新の情報に更新(F5)」ボタンを押下
PRGパターンサンプル_6

7) 画面表示内容が変わらず、再登録はされないことが確認される。
PRGパターンサンプル_7

今回は、このPRG(Post&Redirect&Get)パターンを利用したサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

Spring BootでAjaxを利用してみたSpring BootのWEB画面上では、Ajax通信も行うことができる。今回は、jQueryを利用しない形で、Ajax通信を含むサンプ...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

まず、Post方式確認用画面のHTMLファイルの内容は以下の通りで、「登録」ボタン押下時に「addDataPost」メソッドが呼ばれるようになっている。

次に、Post&Redirect&Get方式確認用画面のHTMLファイルの内容は以下の通りで、「登録」ボタン押下時に「addDataPostRedirectGet」メソッドが呼ばれるようになっている。それ以外はPost方式確認用画面のHTMLファイルと同じ内容になっている。

また、初期表示画面は以下の通りで、「index_post.html」「index_prg.html」へ画面遷移する内容になっている。

また、コントローラクラスの内容は以下の通りで、「addDataPost」メソッドは登録後Postのみ行っていて、「addDataPostRedirectGet」メソッドはPost後にRedirectしてGetする処理を行っている。その他、「index_post.html」「index_prg.html」画面表示時は、ユーザーリストを取得している。

その他、フォームオブジェクトの内容は以下の通りで、今回はチェック処理を入れていない。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-prg-pattern/demo

サンプルプログラムの実行結果

Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下の画面が表示される
実行結果_1

「Post方式確認用画面に遷移」ボタンを押下すると、下記画面が表示される
実行結果_2
この後の動作は、本記事の前方に記載した1)~4)を参照のこと。

また、「Post&Redirect&Get方式確認用画面に遷移」ボタンを押下すると、下記画面が表示される
実行結果_3
この後の動作は、本記事の前方に記載した5)~7)を参照のこと。

要点まとめ

  • PRGパターンとは、Postした後でリダイレクトして画面表示するパターンのことで、これを利用すると、ブラウザを再度読み込んだ場合に再度サブミット処理が実行されるのを防ぐことができる。
  • PRGパターンを利用するには、コントローラクラスでパスに「redirect:/(HTMLファイルへのパス)」を指定すればよい。