Spring MVC RedirectAttributes取值方法
RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的
他有两种带参的方式:
第一种:
attr.addAttribute("param", value);
这种方式就相当于重定向之后,在url后面拼接参数,这样在重定向之后的页面或者控制器再去获取url后面的参数就可以了,但这个方式因为是在url后面添加参数的方式,所以暴露了参数,有风险
例:
<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在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉
例:
<br>
attr.addFlashAttribute(
"status"
,
"999"
);<br>
attr.addFlashAttribute(
"message"
,
"登录失败"
);<br>
return
"redirect:/toLogin"
;<br>
这种方式确实能重定向带参,但是有个问题,这个只能重定向到页面上,也就是说重定向的这个页面视图,能用el表达式直接获取你带参的值,比如status 和message ,都能获取。 可是我重定向到另一个Controller的时候,这个控制器里面没法获取这两个参数
解决办法1:
@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;
}
解决办法2
@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; }