Spring Bootのリダイレクトとステータスコードの違いとは?302・303・307の使い分けを初心者向けに解説
生徒
「Spring Bootでリダイレクトを使いたいんですけど、302とか303とか307って何が違うんですか?」
先生
「いい質問ですね。リダイレクトに使うHTTPステータスコードは見た目は似ていても、実は使い分けがとても大事なんです。」
生徒
「うっかり全部同じように302でリダイレクトしてました…」
先生
「それでは、Spring Bootでのリダイレクト処理とHTTPステータスコードの違いをしっかり整理していきましょう!」
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の特徴と使いどころ
302はもっとも一般的なリダイレクトステータスコードです。しかし、RFCではGETやHEADメソッドに対して使うことを想定しており、POSTのようなメソッドでは意図しない動作になることがあります。
例えば、POSTでリクエストしたあとに302でリダイレクトされると、クライアントはGETとして次のURLにアクセスすることがあります。これはフォームの二重送信を防ぐ処理には便利ですが、意図しない副作用があることも。
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の使い方と違い
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. リダイレクトのステータスコードまとめ
リダイレクトを使う場面は多くありますが、状況に応じて正しいステータスコードを選ばないと、ユーザー体験やAPI動作に影響が出ることがあります。以下のように整理して使い分けましょう。
- 302:簡易リダイレクト。
GETでのリダイレクトにはOKだが、POST時の動作は保証されない。 - 303:
POSTの後にGETで確認ページへリダイレクト。フォーム送信後のサンクスページに最適。 - 307:リクエストのままリダイレクト。APIや処理の連携などで
POSTを維持したい場合に使う。
6. Spring Bootでのステータスコード変更方法
通常のredirect:では302が自動で使われます。303や307を使いたい場合は、HttpServletResponseなどを用いた明示的な制御が必要になります。これは以下のように設定します。
@GetMapping("/custom-redirect")
public void customRedirect(HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_SEE_OTHER);
response.setHeader("Location", "/redirected-page");
}
コントローラの返り値ではなく、レスポンスオブジェクトに対してステータスコードとLocationヘッダーを直接指定することで、細かく制御できます。
7. リダイレクト処理のユースケースと注意点
フォームの再送信防止やセキュリティ、ログイン処理、APIのバージョン移行時の旧URLから新URLへの誘導など、Spring Bootでのリダイレクト処理はとても重要です。
SEOの観点では301(恒久的リダイレクト)が使われますが、今回は一時的な移動に絞って解説しました。なお、307や303はユーザーエージェントの実装によって動作に差が出ることもあるので、実装後に動作検証を忘れずに行うことが大切です。