| 方式 | 語法 | 請求次數 | 數據攜帶 | URL 變化 | 適用場景 |
| 重導向 | redirect:/path | 2 次(302 + 新請求) | ModelAndView / RedirectAttributes | 瀏覽器地址欄更新 | POST 後跳轉、跨模組、防重複提交 |
| 轉發 | forward:/path | 1 次(服務端內部) | request 域共享 | 地址欄不變 | 同模組內部流程、共享請求數據 |
三種參數傳遞模式實戰
1. 無參數跳轉(最簡單)
// 方式一:ModelAndView
return new ModelAndView("redirect:/user/list");
// 方式二:String(推薦,簡潔)
return "redirect:/user/list";
2. 參數拼接 URL(手動/RedirectAttributes 自動)
@RequestMapping("/save")
public String save(RedirectAttributes attr) {
// 自動拼接:/user/list?id=100&name=Tom
attr.addAttribute("id", 100);
attr.addAttribute("name", "Tom");
return "redirect:/user/list";
}
// 目標方法接收
@RequestMapping("/list")
public String list(@RequestParam("id") Long id, @RequestParam("name") String name) { ... }
注意:中文參數會自動 URL 編碼,但建議僅傳遞簡單類型(ID、狀態碼),複雜對象勿用此法。
3. 參數不顯示在 URL(Flash 屬性 —— 核心推薦)
@RequestMapping("/save")
public String save(UserForm form, RedirectAttributes attr) {
String code = service.save(form);
if ("000".equals(code)) {
// 存入 FlashMap(底層用 Session,取一次即刪除)
attr.addFlashAttribute("success", "保存成功!");
attr.addFlashAttribute("userName", form.getName());
return "redirect:/user/list";
} else {
// 失敗頁保留表單回顯數據
attr.addFlashAttribute("error", "錯誤碼:" + code);
attr.addFlashAttribute("form", form); // 回顯對象
return "redirect:/user/add";
}
}
// 目標頁直接用 EL 取值:${success}、${userName}、${form.name}
// 刷新頁面屬性自動消失,完美防重複提交提示
addAttribute vs addFlashAttribute 核心差異
| 特性 | addAttribute | addFlashAttribute |
| 存儲位置 | URL 參數 | Session(FlashMap) |
| 生命週期 | 永久(除非手動清理) | 下一次請求讀取後自動移除 |
| 適用數據 | 簡單標識(ID、狀態) | 提示訊息、表單回顯、敏感數據 |
| 刷新行為 | 參數保留 | 數據消失(防重複提交) |
進階配置:忽略默認 Model 提升性能
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="ignoreDefaultModelOnRedirect" value="true"/>
</bean>
開啟後,重導向時不會自動將 Model 所有屬性掃描並嘗試放入 URL,減少無謂序列化開銷。
常見坑與避雷
- forward 後用 EL 取不到 Flash 屬性:Flash 僅支援 redirect,forward 請用
request.setAttribute。
- 重導向到 JSP 直接失效:
redirect:/page.jsp 會走 DispatcherServlet 再次解析,應重導向到 @RequestMapping 方法。
- 中文參數亂碼:確保 Tomcat
URIEncoding="UTF-8",且 Spring 配置 CharacterEncodingFilter。
- 上一篇文章: Java 排序深度解析:Comparable、Comparator、中文排序與 TreeSet 源碼全景圖
- 下一篇文章: Java 構造方法全解析:重載、鏈式調用、默認構造、繼承鏈與訪問權限控制
Copyright ©
程式碼之家 All Rights Reserved