RedirectAttributes是Spring mvc 3.1版本以後出來的一個功能,專門用於重定向以後還能帶參數跳轉的
他有兩種帶參的方式:
第一種:
attr.addAttribute("param", value);
這種方式就至關於重定向以後,在url後面拼接參數,這樣在重定向以後的頁面或者控制器再去獲取url後面的參數就能夠了,但這個方式由於是在url後面添加參數的方式,因此暴露了參數,有風險
例:java
<br>
attr.addFlashAttribute(
"name"
,
"123"
); <br>
attr.addFlashAttribute(
"success"
,
"success"
);<br>
return
"redirect:/index"
;<br>
這樣就至關於:return "redirect:/index?name=123&success=success"
第二種:
attr.addFlashAttribute("param", value);
這種方式也能達到從新向帶參,並且能隱藏參數,其原理就是放到session中,session在跳到頁面後立刻移除對象。因此你刷新一下後這個值就會丟掉
例:session
<br>
attr.addFlashAttribute(
"status"
,
"999"
);<br>
attr.addFlashAttribute(
"message"
,
"登陸失敗"
);<br>
return
"redirect:/toLogin"
;<br>
這種方式確實能重定向帶參,可是有個問題,這個只能重定向到頁面上,也就是說重定向的這個頁面視圖,能用el表達式直接獲取你帶參的值,好比status 和message ,都能獲取。 但是我重定向到另外一個Controller的時候,這個控制器裏面無法獲取這兩個參數mvc
解決辦法1:app
@RequestMapping("flash1")
public String flash(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("username", "Biao");
return "redirect:flash2";
}
@RequestMapping("flash2")
public String flash2(@ModelAttribute("username") String username) {
System.out.println("拿到的username="+username);
return "username: " + username;
}ui
解決辦法2url
@RequestMapping("/zh") public String reZh(RedirectAttributes attr){ attr.addAttribute("time","ssssss"); attr.addFlashAttribute("hi","hello"); return "redirect:/date?time={time}"; } @GetMapping("/date") public String toDate(@RequestParam(value = "time",required = false)String s,HttpServletRequest request){ Object hi = RequestContextUtils.getInputFlashMap(request).get("hi"); System.out.println(hi); return s; }