Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。
リダイレクトとフォワードの違いについては、以下のサイトを参照のこと。
https://www.atmarkit.co.jp/ait/articles/0407/06/news077.html
今回は、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡すサンプルプログラムを作成してみたので、共有する。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。
初期表示画面の内容は以下の通りで、リダイレクト遷移とフォワード遷移を行うボタンを配置している。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index page</title>
</head>
<body>
これは初期表示画面です。 <br/><br/>
<form method="post" th:action="@{/toRedirect}">
<input type="submit" value="リダイレクト遷移" />
</form><br/><br/>
<form method="post" th:action="@{/toForward}">
<input type="submit" value="フォワード遷移" />
</form><br/><br/>
</body>
</html>また、メイン画面の内容は以下の通りで、リダイレクト遷移・フォワード遷移により渡されたパラメータを表示している。
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>main page</title>
</head>
<body>
メイン画面に遷移しました。<br/><br/>
押下されたボタン: <span th:text="${pushedBtn}">pushedBtnの値</span><br/>
通過したメソッド: <span th:text="${passedMethod}">passedMethodの値</span>
<br/><br/>
<form method="post" th:action="@{/toIndex}">
<input type="submit" value="戻る" />
</form>
</body>
</html> さらに、コントローラクラスの内容は以下の通りで、リダイレクトとフォワードそれぞれで画面遷移を行い、画面遷移先にパラメータを渡す処理を実装している。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
public class DemoController {
/**
* 初期表示画面に遷移する
* @return 初期表示画面
*/
@GetMapping("/")
public String index(){
return "index";
}
/**
* メイン画面にGETメソッドで遷移する
* @param model Modelオブジェクト
* @return メイン画面
*/
@GetMapping("/toMainGet")
public String toMainGet(Model model){
model.addAttribute("passedMethod", "toMainGetメソッド");
return "main";
}
/**
* メイン画面にPOSTメソッドで遷移する
* @param model Modelオブジェクト
* @return メイン画面
*/
@PostMapping("/toMainPost")
public String toMainPost(Model model){
model.addAttribute("passedMethod", "toMainPostメソッド");
return "main";
}
/**
* リダイレクトでメイン画面に遷移する
* @param redirectAttributes リダイレクト属性値
* @return メイン画面
*/
@PostMapping("/toRedirect")
public String toRedirect(RedirectAttributes redirectAttributes){
// メイン画面に渡す値を設定する
// リダイレクト遷移する場合はFlash Scopeを利用する
redirectAttributes.addFlashAttribute("pushedBtn", "リダイレクト遷移ボタン");
// リダイレクトでメイン画面に遷移する
// このとき、リダイレクト遷移先はGETメソッドとする
return "redirect:/toMainGet";
}
/**
* フォワードでメイン画面に遷移する
* @param model Modelオブジェクト
* @return メイン画面
*/
@PostMapping("/toForward")
public String toForward(Model model){
// メイン画面に渡す値を設定する
// フォワード遷移する場合はModelオブジェクトに値を設定する
model.addAttribute("pushedBtn", "フォワード遷移ボタン");
// フォワードでメイン画面に遷移する
// このとき、リダイレクト遷移先はPOSTメソッドのままとする
return "forward:/toMainPost";
}
/**
* 初期表示画面に戻る
* @return 初期表示画面
*/
@PostMapping("/toIndex")
public String toIndex(){
return "index";
}
}
また、コンフィグクラスの内容は以下の通りで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐようにしている。
package com.example.demo;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.SessionTrackingMode;
import java.util.Collections;
@Configuration
public class DemoConfigBean {
/**
* 初回アクセス時に、URLにjsessionidが付与されるのを防ぐためのBean定義
* @return ServletContextInitializerオブジェクト
*/
@Bean
public ServletContextInitializer servletContextInitializer() {
ServletContextInitializer initializer = servletContext -> {
servletContext.setSessionTrackingModes(
Collections.singleton(SessionTrackingMode.COOKIE)
);
};
return initializer;
}
}
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-redirect-forward/demo
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下のように、初期表示画面が表示されることが確認できる。

2) 「リダイレクト遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、リダイレクト遷移先である「toMainGet」メソッドのURLとなっている。


4) 「フォワード遷移」ボタンを押下すると、メイン画面に遷移する。このときのURLは、フォワード遷移元である「toForward」メソッドのURLとなっている。


5) 次に、以下のように、DemoConfigBean.javaの「@Bean」アノテーションを無効にし、「初回アクセス時に、URLにjsessionidが付与されるのを防ぐためのBean定義」を無効にする。

6) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセス後、「リダイレクト遷移」ボタンを押下すると、URLにjsessionidが付与されることが確認できる。


要点まとめ
- Webアプリケーションの画面遷移方法には、redirect(リダイレクト)と forward(フォワード)がある。
- 遷移先コントローラ指定時のパス先頭に、リダイレクト遷移するには「redirect:」を付与し、フォワード遷移するには「forward:」を付与すればよい。
- HTTP POSTメソッドで呼ばれた場合、リダイレクト遷移先はHTTP GETメソッドとなり、フォワード遷移先はHTTP POSTメソッドとなる。
- 遷移先にパラメータを渡す場合は、リダイレクト遷移時はFlash Scopeを利用し、フォワード遷移時はModelオブジェクトを利用すればよい。
- Spring Bootアプリケーションで、HTTP GETメソッドが呼ばれた場合に、jsessionid=XXXというパラメータが表示されるのを防ぐ設定を行うこともできる。






