摘要
在開發(fā)場景中,大部分?jǐn)?shù)據(jù)都是使用請求轉(zhuǎn)發(fā)(forward)進(jìn)行傳遞奖恰,而使用重定向(redirect)傳遞數(shù)據(jù)可能比較少。
那么問題來了:請求中的數(shù)據(jù)生命周期存活時間只在一個請求轉(zhuǎn)發(fā)(request)中,當(dāng)這個請求結(jié)束后,那么請求中所帶的數(shù)據(jù)也會隨著這個請求一起拜拜了戳玫。而重定向會向服務(wù)器發(fā)起兩個請求,所以第一個請求的數(shù)據(jù)不就到不了第二個請求了嗎未斑?如圖:
如果我們想傳遞的數(shù)據(jù)在第二個請求中有效量九,那么怎么辦呢?
有以下兩種方法可以解決:
url路徑傳遞
使用flash屬性
url路徑傳遞
url 路徑傳遞是比較簡單的一種選擇方式颂碧,因?yàn)橹囟ㄏ蚝驼埱筠D(zhuǎn)發(fā)不同荠列,所以在重定向時必須要前面加上redirect:
(不加的話默認(rèn)就為請求轉(zhuǎn)發(fā)):
下面為重定向到colablog
路徑下,傳遞{username}
參數(shù):如下:
// 如 "redirect:/colablog/johnson"
return "redirect:/colablog/{username}"
還有一種方式是使用模板方式來定義重定向的URL载城,如:
@GetMapping("/red")
public String redirect(Model model) {
User user = ...;
model.addAttribute("username", user.getUsername());
return "redirect:/colablog/{username}";
}
若 user.getUsername()
為 johnson肌似,那么重定向的url將會變成redirect:/colablog/johnson
。
使用flash屬性
可以發(fā)現(xiàn)诉瓦,使用url傳遞的都是一些比較簡單的數(shù)據(jù)川队,當(dāng)我們需要傳遞對象時,可要怎么辦呢睬澡?Spring提供了數(shù)據(jù)發(fā)送為flash功能固额,flash屬性會一直攜帶這些數(shù)據(jù)直到下一次請求,然后才會消失煞聪。提供實(shí)現(xiàn)的方法為RedirectAttributes
的addFlashAttribute
方法斗躏。如下:
@GetMapping("/test")
public String test(RedirectAttributes attributes){
User user = ...;
attributes.addFlashAttribute("user", user);
return "redirect:/colablog";
}
取出數(shù)據(jù)還是老樣子,像請求轉(zhuǎn)發(fā)(forward)那樣獲取數(shù)據(jù)昔脯。
@GetMapping("/colablog")
public String colaBlog(Model model) {
User user = model.getAttribute("user");
return "success";
}
RedirectAttributes
有Model
類的所有方法啄糙,因?yàn)?code>RedirectAttributes是Model
的擴(kuò)展類笛臣。
public interface RedirectAttributes extends Model {}
至于為什么使用flash屬性會攜帶到下一次請求中,然后才會消失呢隧饼?因?yàn)樵揻lash屬性的數(shù)據(jù)會存放到會話當(dāng)中沈堡,在重定向后,存在會話中的flash屬性會被取出燕雁,從會話數(shù)據(jù)轉(zhuǎn)移到模型數(shù)據(jù)之中诞丽。如下圖:
好了,文章到這里就結(jié)束了拐格,不知道各位小伙伴看懂了沒率拒。若還有問題可在下方留言,Thanks?(?ω?)?
參考文獻(xiàn):《Spring實(shí)戰(zhàn) 第4版》
個人博客網(wǎng)址: https://colablog.cn/
如果我的文章幫助到您禁荒,可以關(guān)注我的微信公眾號猬膨,第一時間分享文章給您