核心語法
@Controller
public class MyController {
@RequestMapping("/action1")
public String handle() {
// 業務邏輯...
return "redirect:/action2"; // 客戶端跳轉,瀏覽器地址欄變化
// return "forward:/action2"; // 服務端內部轉發,地址欄不變
}
@RequestMapping("/action2")
public String target() {
return "viewPage"; // 解析為 /WEB-INF/views/viewPage.jsp
}
}
redirect vs forward 對比
| 特性 | redirect: | forward: |
| HTTP 狀態碼 | 302 Found | 無(內部轉發) |
| 瀏覽器地址欄 | 變為目標 URL | 保持原 URL |
| 請求對象 | 新請求(原 request 失效) | 同一 request |
| 數據傳遞 | 需攜帶參數或用 FlashMap/Session | 直接訪問 request 屬性 |
| 適用場景 | 表單提交後防重複刷新 (PRG 模式)、跨應用跳轉 | 同一請求鏈路內分派、錯誤頁面轉發 |
傳遞數據的三種方式
- URL 參數:
return "redirect:/action2?id=123&name=abc";
- RedirectAttributes (Spring 3.1+):
redirectAttributes.addFlashAttribute("msg", "成功"); 目標方法用 @ModelAttribute("msg") String msg 接收。
- Session:大對象或跨控制器,
session.setAttribute("key", obj)。
最佳實踐:PRG 模式
@PostMapping("/save")
public String save(@Valid Form form, RedirectAttributes ra) {
service.save(form);
ra.addFlashAttribute("success", true);
return "redirect:/list"; // 避免 F5 重複提交
}