カテゴリ: Spring 更新日: 2025/10/15

Spring Bootのリダイレクトとステータスコードの違いとは?302・303・307の使い分けを初心者向けに解説

Spring Bootのリダイレクトとステータスコード:302/303/307の正しい使い分け
Spring Bootのリダイレクトとステータスコード:302/303/307の正しい使い分け

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

生徒

「Spring Bootでリダイレクトを使いたいんですけど、302とか303とか307って何が違うんですか?」

先生

「いい質問ですね。リダイレクトに使うHTTPステータスコードは見た目は似ていても、実は使い分けがとても大事なんです。」

生徒

「うっかり全部同じように302でリダイレクトしてました…」

先生

「それでは、Spring Bootでのリダイレクト処理とHTTPステータスコードの違いをしっかり整理していきましょう!」

1. Spring Bootのリダイレクトとは?

1. Spring Bootのリダイレクトとは?
1. Spring Bootのリダイレクトとは?

Spring Bootでは、コントローラーの戻り値でredirect:を使うことで、簡単に別のURLへリダイレクトが可能です。リダイレクトとは、クライアントに「別の場所へアクセスし直してね」と指示する仕組みです。


@Controller
public class RedirectExampleController {

    @GetMapping("/old-url")
    public String redirectToNewUrl() {
        return "redirect:/new-url";
    }
}

上記のコードでは、/old-urlにアクセスすると、/new-urlへリダイレクトされます。ここで使われるステータスコードは通常302 Foundになります。

2. 302 Foundの特徴と使いどころ

2. <code>302 Found</code>の特徴と使いどころ
2. 302 Foundの特徴と使いどころ

302はもっとも一般的なリダイレクトステータスコードです。しかし、RFCではGETHEADメソッドに対して使うことを想定しており、POSTのようなメソッドでは意図しない動作になることがあります。

例えば、POSTでリクエストしたあとに302でリダイレクトされると、クライアントはGETとして次のURLにアクセスすることがあります。これはフォームの二重送信を防ぐ処理には便利ですが、意図しない副作用があることも。

3. 303 See Otherの正しい用途

3. <code>303 See Other</code>の正しい用途
3. 303 See Otherの正しい用途

303は、POSTメソッドでリソースを作成したあと、GETで確認用のページに移動する時などに使います。302よりも安全で意図通りの動作が保証されます。

Spring Bootで明示的に303を返すには、HttpServletResponseを使ってステータスコードを設定します。


@GetMapping("/submit")
public void handleForm(HttpServletResponse response) throws IOException {
    response.setStatus(HttpServletResponse.SC_SEE_OTHER); // 303
    response.setHeader("Location", "/confirmation");
}

4. 307 Temporary Redirectの使い方と違い

4. <code>307 Temporary Redirect</code>の使い方と違い
4. 307 Temporary Redirectの使い方と違い

307は、リクエストメソッドとボディをそのまま次のURLに転送することを明示するリダイレクトです。つまり、POSTでリクエストしたら、リダイレクト先にもPOSTでアクセスされるのです。

セキュリティやAPI連携など、リクエスト内容を保持したまま別のエンドポイントに転送したいときに利用します。


@PostMapping("/api/entry")
public void redirectWithPost(HttpServletResponse response) {
    response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT); // 307
    response.setHeader("Location", "/api/new-entry");
}

5. リダイレクトのステータスコードまとめ

5. リダイレクトのステータスコードまとめ
5. リダイレクトのステータスコードまとめ

リダイレクトを使う場面は多くありますが、状況に応じて正しいステータスコードを選ばないと、ユーザー体験やAPI動作に影響が出ることがあります。以下のように整理して使い分けましょう。

  • 302:簡易リダイレクト。GETでのリダイレクトにはOKだが、POST時の動作は保証されない。
  • 303POSTの後にGETで確認ページへリダイレクト。フォーム送信後のサンクスページに最適。
  • 307:リクエストのままリダイレクト。APIや処理の連携などでPOSTを維持したい場合に使う。

6. Spring Bootでのステータスコード変更方法

6. Spring Bootでのステータスコード変更方法
6. Spring Bootでのステータスコード変更方法

通常のredirect:では302が自動で使われます。303307を使いたい場合は、HttpServletResponseなどを用いた明示的な制御が必要になります。これは以下のように設定します。


@GetMapping("/custom-redirect")
public void customRedirect(HttpServletResponse response) {
    response.setStatus(HttpServletResponse.SC_SEE_OTHER);
    response.setHeader("Location", "/redirected-page");
}

コントローラの返り値ではなく、レスポンスオブジェクトに対してステータスコードとLocationヘッダーを直接指定することで、細かく制御できます。

7. リダイレクト処理のユースケースと注意点

7. リダイレクト処理のユースケースと注意点
7. リダイレクト処理のユースケースと注意点

フォームの再送信防止やセキュリティ、ログイン処理、APIのバージョン移行時の旧URLから新URLへの誘導など、Spring Bootでのリダイレクト処理はとても重要です。

SEOの観点では301(恒久的リダイレクト)が使われますが、今回は一時的な移動に絞って解説しました。なお、307303はユーザーエージェントの実装によって動作に差が出ることもあるので、実装後に動作検証を忘れずに行うことが大切です。

カテゴリの一覧へ
新着記事
Javaのラムダ式で戻り値とvoidの使い方を解説!returnの書き方も完全理解
Javaのメソッド参照とコンストラクタ参照の使い方を完全ガイド!初心者向けに::とClass::newを解説
Javaのラムダ式の書き方を徹底解説!アロー演算子->の基本と使い方
Thymeleafのth:eachの使い方!ループ回数やindexなどの繰り返し処理を学ぼう
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring Boot JPA入門:エンティティ/リポジトリの基本と作り方
No.3
Java&Spring記事人気No3
Javaの@Validアノテーションを徹底解説!初心者でもわかる入力値検証の基本
No.4
Java&Spring記事人気No4
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス