リダイレクトとフォワードの実装方法
Spring MVCでクライアントのリクエストを別のエンドポイントに誘導する際、リダイレクトとフォワードの2つの手法が利用可能です。以下に具体的な実装パターンを示します。
リダイレクトの実装
コントローラーメソッドの戻り値にredirect:プレフィックスを付加する方法がシンプルです。アプリケーションルートからの絶対パスを指定します。
@GetMapping("/login")
public String handleLogin() {
return "redirect:/dashboard";
}
より細かい制御が必要な場合はResponseEntityを使用します。HTTPステータスコードを明示的に指定可能です。
@GetMapping("/legacy")
public ResponseEntity<Void> migrateSystem() {
return ResponseEntity
.status(HttpStatus.SEE_OTHER)
.location(URI.create("/new-system"))
.build();
}
フォワードの実装
サーバー内部で処理を別のエンドポイントに委譲する場合はforward:プレフィックスを使用します。クライアントは元のURLを維持したまま処理が行われます。
@PostMapping("/submit")
public String processForm() {
return "forward:/confirmation";
}
AJAXリクエストの処理フロー
フロントエンドとの非同期通信を実現するための主要な実装パターンを説明します。
コントローラーの実装
@RestControllerアノテーションを使用すると、メソッドの戻り値が自動的にJSONに変換されます。以下は商品情報取得APIの実装例です。
@RestController
@RequestMapping("/api/products")
public class ProductApiController {
@GetMapping("/{code}")
public ProductDetail fetchProduct(@PathVariable String code) {
return productService.findDetailByCode(code);
}
}
フロントエンドの実装
fetch APIを用いたリクエスト例です。非同期処理でサーバー応答を処理します。
async function loadProduct(code) {
try {
const response = await fetch(`/api/products/${code}`);
return await response.json();
} catch (error) {
console.error('API通信エラー:', error);
throw error;
}
}
文字コード問題の解消アプローチ
日本語を含むマルチバイト文字の処理で発生するエンコーディング問題に対する対策です。
POSTリクエストの対策
Springが提供するCharacterEncodingFilterをweb.xmlに登録します。UTF-8エンコーディングを強制適用します。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
GETリクエストの特殊対応
サーバー側のURI処理エンコーディングを明示的に設定する必要があります。Tomcatのserver.xmlでURIEncoding="UTF-8"を指定します。
<Connector
port="8080"
protocol="HTTP/1.1"
URIEncoding="UTF-8" />
これにより、クエリパラメータの日本語が正しくデコードされます。