カテゴリ: Spring 更新日: 2026/06/02

Spring MVCのフォワードとリダイレクトの違いと使い分け完全解説!初心者向け

Spring MVCのフォワード/リダイレクト:forward:/ と redirect:/ の使い分け
Spring MVCのフォワード/リダイレクト:forward:/ と redirect:/ の使い分け

先生と生徒の会話形式で理解しよう

生徒

「Spring MVCでredirect:/とかforward:/って書いてあるのを見たんですが、これってどう違うんですか?」

先生

「それはSpring MVCでリクエストを他のページに移すときの指定方法ですね。フォワードとリダイレクトは仕組みが違うので、用途によって使い分ける必要がありますよ。」

生徒

「どっちを使えばいいか迷ってしまって…具体的な違いを知りたいです!」

先生

「それでは、forward:/redirect:/の基本的な違いと、使いどころ、注意点などを丁寧に説明していきましょう。」

1. Spring MVCのフォワードとリダイレクトの基本

「1. Spring MVCのフォワードとリダイレクトの基本」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

1. Spring MVCのフォワードとリダイレクトの基本
1. Spring MVCのフォワードとリダイレクトの基本

Spring MVCを利用したWeb開発において、コントローラーから「どの画面を表示するか」を制御する仕組みは非常に重要です。通常、return "home";のようにテンプレート名を返すと、そのままHTMLが表示されます。しかし、特定の処理後に別のプログラムへ処理を委ねたい場合には、forward:/redirect:/という接頭辞を使用します。

これらは一見似ていますが、「サーバーの中でこっそり中身を入れ替える(フォワード)」のか、「ブラウザに別のURLへ行くよう命令を出す(リダイレクト)」のかという決定的な違いがあります。プログラミング未経験の方でもイメージしやすいよう、役所の窓口に例えたサンプルで考えてみましょう。

例え話でイメージをつかもう
  • フォワード(Forward):窓口Aの担当者が、後ろにいる担当者Bに書類を回して処理を継続する。相談者は窓口Aの前に座ったままで、誰が処理したかは意識しない。
  • リダイレクト(Redirect):窓口Aの担当者が「その件は2階の5番窓口へ行ってください」と指示する。相談者は一度席を立ち、自分の足で新しい窓口へ移動する。

@Controller
public class SampleController {

    // フォワードの例:URLは /entry のまま、中身だけ /confirm に移る
    @GetMapping("/entry")
    public String entry() {
        return "forward:/confirm";
    }

    // リダイレクトの例:ブラウザに /success へ移動するように命令を出す
    @PostMapping("/submit")
    public String submit() {
        return "redirect:/success";
    }
}

このように、Spring MVCでは戻り値の文字列を工夫するだけで、通信の挙動をコントロールできます。それぞれの仕組みを詳しく見ていきましょう。

forward:/〜

サーバー内部で別の処理に渡すため、ユーザーのブラウザに表示されているURLは変わりません。リクエスト(お願い事)の内容をそのまま次の処理に引き継げます。

redirect:/〜

ブラウザに対して「新しいURLにアクセスし直して!」と指示を出します。URLが新しいものに書き換わり、全く新しいリクエストとして処理が始まります。

2. forward:/ の使い方と特徴

2. forward:/ の使い方と特徴
2. forward:/ の使い方と特徴

forward:/(フォワード)は、サーバーの内部で別のプログラムに「バトンタッチ」をする仕組みです。最大の特徴は、ユーザーが使っているブラウザに「移動したこと」を知らせない点にあります。

初心者向けのイメージ解説

あなたがデパートの「総合案内所」で「落とし物の相談」をしたとします。案内所のスタッフが、自分では答えられないので、後ろの席にいる「遺失物担当者」に書類を回して、そのまま回答をもらうのがフォワードです。

あなたは窓口を動いていませんし、誰が最終的に回答を用意したのかは分かりません。これと同じで、ブラウザのURLも元のまま変わらないのです。

フォワードを使うと、最初のリクエスト(お願い事)に含まれるデータ(入力内容など)を、次の処理へそのまま引き渡すことができます。これを「リクエストスコープの維持」と呼びます。Javaのコードで具体的な流れを見てみましょう。


@Controller
public class ForwardController {

    // 1. ユーザーが最初にアクセスするURL
    @GetMapping("/start")
    public String start(HttpServletRequest request) {
        // サーバー内のメモ帳(リクエスト)に名前を書き込む
        request.setAttribute("userName", "たろうさん");
        
        // URLは /start のまま、内部で /next という処理にバトンタッチ
        return "forward:/next";
    }

    // 2. バトンを受け取った後の処理
    @GetMapping("/next")
    public String next() {
        // 最終的に表示するHTMLファイル(result.html)を指定
        return "result";
    }
}

実行結果のポイント

  • ブラウザのアドレス欄は /start のまま動きません。
  • 内部的には /next の処理が動いており、画面には result.html の内容が表示されます。
  • /start でセットした「たろうさん」というデータは、/next でも消えずに使うことができます。

このように、一つの作業を複数のプログラムで分割して行いたいけれど、ユーザーにはその裏側を見せたくない(URLを変えたくない)場合に、フォワードは非常に便利な方法です。

3. redirect:/ の使い方と特徴

3. redirect:/ の使い方と特徴
3. redirect:/ の使い方と特徴

redirect:/(リダイレクト)は、サーバーからブラウザに対して「別のURLへアクセスし直してください」と依頼を出す仕組みです。フォワードが「サーバー内での内緒のバトンタッチ」だったのに対し、リダイレクトは「外の世界(ブラウザ)を通じた正式な移動」といえます。

初心者向けのイメージ解説

役所の例えでいうと、窓口の担当者が「その手続きは、あちらの2号館にある専用窓口で行ってください」と案内するようなものです。あなたは一度席を立ち、建物を移動して、新しい窓口で改めて「お願いします」と声をかけますよね。

このとき、ブラウザのアドレスバーのURLは自動的に新しいものに書き換わります。全く新しい通信(リクエスト)が発生するため、前の画面で入力した一時的なデータは原則として消えてしまうのが特徴です。

Spring MVCでは、リダイレクト後にデータを渡したい場合、RedirectAttributesという仕組みを利用します。これにより、完了メッセージなどを次の画面へ安全に引き継ぐことができます。実際のコードを見てみましょう。


@Controller
public class RedirectController {

    // 1. フォーム送信を受け付ける処理
    @PostMapping("/register")
    public String register(RedirectAttributes redirectAttributes) {
        // データベース保存などの処理が完了したと想定
        
        // リダイレクト先に一時的なメッセージを仕込む(Flash Attribute)
        redirectAttributes.addFlashAttribute("msg", "登録が完了しました!");
        
        // ブラウザに /success というURLへ移動するよう命令する
        return "redirect:/success";
    }

    // 2. 移動先の画面を表示する処理
    @GetMapping("/success")
    public String success() {
        // success.html を表示する
        return "success";
    }
}

実行結果のポイント

  • ブラウザのURLは /register から /success へとはっきり切り替わります。
  • ユーザーがブラウザで「更新ボタン」を押しても、表示されている /success が再読み込みされるだけなので、二重にデータが登録される心配がありません。
  • addFlashAttribute で設定したデータは、リダイレクト直後の画面表示で一度だけ利用でき、その後自動的に消去されます。

このように、データの登録や更新といった「状態が変わる処理」の後は、リダイレクトを使ってURLを切り替えるのがWeb開発の鉄則となっています。

4. フォワードとリダイレクトの違いを一覧比較

「4. フォワードとリダイレクトの違いを一覧比較」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

4. フォワードとリダイレクトの違いを一覧比較
4. フォワードとリダイレクトの違いを一覧比較
項目 forward:/ redirect:/
処理の流れ サーバー内部での転送 ブラウザが別リクエストを送る
URL 変わらない 変わる
リクエスト情報 そのまま引き継ぐ 失われる(Flash使えば可)
用途 同一処理内でのページ遷移 完了画面や一覧画面への遷移

5. forward:/ と redirect:/ の実行結果の違い

5. forward:/ と redirect:/ の実行結果の違い
5. forward:/ と redirect:/ の実行結果の違い

それぞれの動作を確認してみましょう。

forwardの結果

URLが変わらず、内部で次の処理に移るため、フォームなどの再送信が起こることがあります。


URL: /start
表示ページ: result.html

redirectの結果

リダイレクト後のURLが表示され、再読み込みしても同じページが出るようになります。


URL: /complete
表示ページ: complete.html

6. 使い分けのベストプラクティス

6. 使い分けのベストプラクティス
6. 使い分けのベストプラクティス

実務では以下のように使い分けるとよいでしょう。

  • forward → バリデーションエラーがあったときの入力画面再表示
  • redirect → 登録完了後のサンクスページ、一覧画面遷移
  • Post/Redirect/Getパターン → フォーム送信後のリロードで二重登録を防ぐ

7. リダイレクト属性(RedirectAttributes)の活用法

「7. リダイレクト属性(RedirectAttributes)の活用法」の重要ポイントを、初心者の方にも分かりやすく簡潔に解説します。

7. リダイレクト属性(RedirectAttributes)の活用法
7. リダイレクト属性(RedirectAttributes)の活用法

リダイレクトでデータを渡すにはRedirectAttributesを使います。これにより、一時的なメッセージ(Flash Attribute)を渡すことができます。


@PostMapping("/submit")
public String submitForm(RedirectAttributes attr) {
    attr.addFlashAttribute("notice", "送信成功!");
    return "redirect:/thanks";
}

@GetMapping("/thanks")
public String thanks() {
    return "thanks"; // thanks.html に notice を表示
}

テンプレートでは以下のようにしてnoticeを表示できます。


<div th:if="${notice}" class="alert alert-success">
    <p th:text="${notice}"></p>
</div>

まとめ

まとめ
まとめ

Spring MVCのフォワードとリダイレクトの仕組みを理解することで、画面遷移の流れやリクエストスコープの動作、適切な使い分けがより明確になります。とくに業務システム開発では、入力画面から確認画面、完了画面へと進む一連の流れの中で、どの遷移方法を選ぶかがユーザー体験にも大きく影響します。フォワードはサーバー内部で静かに処理が移り、リクエストスコープの属性をそのまま保持するため、入力値の再表示やバリデーションエラー時に自然に利用できます。一方でリダイレクトはブラウザに明示的な移動を指示するため、完了画面の表示や再読み込み時の二重送信回避など、ユーザー操作に対する安全性を高める動作が求められる場面で役立ちます。 また、POST後のリダイレクトを用いる「PRGパターン」は現場では非常によく使われる設計であり、データ登録後の二重送信を避けるための基本的な考え方として知っておく必要があります。リダイレクトでは通常リクエストスコープが引き継がれないものの、Flash Attributeを使うことで一時的なメッセージを安全に渡すことが可能であり、ユーザー通知や確認メッセージの表示に広く活用されます。 ここであらためて、フォワードとリダイレクトの動作を確認する簡単なサンプルプログラムを示し、動作の違いをさらに深く理解していきましょう。実際の画面遷移を想定したコード例を見ることで、URLの変化やリクエストスコープの扱いがどのように変わるかを具体的に体感でき、Spring MVCの遷移設計に自信を持って取り組めるようになります。

フォワードとリダイレクトのサンプルコード


@GetMapping("/input")
public String input(HttpServletRequest request) {
    request.setAttribute("error", "未入力の項目があります");
    return "forward:/form";
}

@PostMapping("/register")
public String register(RedirectAttributes redirectAttributes) {
    redirectAttributes.addFlashAttribute("success", "登録が完了しました");
    return "redirect:/finish";
}

@GetMapping("/finish")
public String finish() {
    return "finish"; // finish.html を表示
}

このように、フォワードは内部処理で値を引き継いで画面へ遷移し、リダイレクトはユーザーのブラウザを通して新しいURLへ移動します。URLの変化や入力再表示の可否など、動作の違いを理解したうえで適切に利用することで、安定したアプリケーションの構築が可能になります。とくに業務システムでは再読み込みによる二重送信がトラブルにつながりやすいため、リダイレクトとFlash Attributeの組み合わせは非常に重要です。

先生と生徒の振り返り会話

生徒

「フォワードとリダイレクトの違いがようやくつかめてきました。URLが変わるかどうかや、リクエストスコープの扱いがとても重要なんですね。」

先生

「そのとおりです。特にフォーム処理では、フォワードで入力値を再表示したり、リダイレクトで二重送信を防止したりと、それぞれの特性を理解して使い分けることが大切ですよ。」

生徒

「Flash Attributeがリダイレクトでも一時的なメッセージを渡せるという仕組みも便利ですね。実務でよく使われる理由が分かりました。」

先生

「はい。通知メッセージや成功メッセージなどはリダイレクト後の画面で表示されることが多いので、とても重宝される機能なんです。今日学んだ内容をしっかり身につけて、今後のSpring MVC開発でも自信を持って使いこなしてくださいね。」

生徒

「ありがとうございました!実際にプロジェクトで活用してみます!」

カテゴリの一覧へ
新着記事
New1
Java
JavaのNotSerializableExceptionを完全解説!初心者でも理解できるシリアライズと例外処理
新規投稿
New2
Spring
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス
更新記事
New3
Spring
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
更新記事
New4
Java
Javaのjava.mathとBigIntegerのintValueメソッドを完全解説!初心者でもわかる数値変換の基本
更新記事
人気記事
No.1
Java&Spring記事人気No1
Servlet
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.2
Java&Spring記事人気No2
JSP
JSPの基本タグ一覧と使い方まとめ!実務で使えるタグを紹介
No.3
Java&Spring記事人気No3
JSP
JSPでフォームを表示して入力を受け取る基本手順をやさしく解説!初心者向けフォーム処理の入門ガイド
No.4
Java&Spring記事人気No4
Spring
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.5
Java&Spring記事人気No5
JSP
JSPでCSSやJSを読み込む基本!外部ファイルのパス指定に注意しよう
No.6
Java&Spring記事人気No6
Spring
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.7
Java&Spring記事人気No7
Spring
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.8
Java&Spring記事人気No8
JSP
JSPでif文・for文を使う方法!初心者でもわかるJavaとの違いと使い方