1.问题引入
问题: 重定向到目标url之后,地址栏带请求参数引发问题
1.用户通过地址栏获取到一些数据
2.用户刷新后仍然在带了请求参数之后的逻辑处理下。
解决方案:通过请求参数加密解密可以解决问题1带来的影响,但是仍然不能解决问题2带来的影响
2.重定向传递参数和取参
1. 传参: 以字符串的形式构建目标url, 可以使用 query variable的格式拼url. 取参: @RequestParam()来fetch
2. 传参: redirectAttributes.addAttribute() 加的attr. 取参: @RequestParam()来fetch
3. 传参: redirectAttributes.addFlashAttribute() 加的attr. 取参: @ModelAttribute()来fetch
3.Flash attribute的特点
Spring MVC 3.1版本加了一个很有用的特性,Flash属性,它能解决一个长久以来缺少解决的问题,一个POST/Redirect/GET模式问题
1. addFlashAttribute() 可以是任意类型的数据(不局限在String等基本类型), addAttribute()只能加基本类型的参数.
2. addFlashAttribute() 加的 attr,不会出现在url 地址栏上.
3. addFlashAttribute() 加的 attr, 一旦fetch后, 就会自动清空, 非常适合 form 提交后 feedback Message.
redirectAttributes.addFlashAttribute()是把参数放在session中 ,跳转之后再从session中移除
4.示例
传值
@RequestMapping("/loginFree")publicString loginFree(HttpServletRequest request, RedirectAttributes attributes)
{
// 省略
commonLogin();
attributes.addFlashAttribute("msg", "哦吼");return "redirect:/index";
}
取值
//方式一
@GetMapping("/index")public String index(ModelMap mmap, @ModelAttribute("msg") String msg) {
Map map =RequestContextUtils.getInputFlashMap(request);
System.out.println(map.get("msg").toString());return "index";
}//方式二
@GetMapping("/index")public String index(ModelMap mmap, @ModelAttribute("msg") String msg) {
System.out.println(msg);return "index";
}
通过这种方式,就可以解决重定向到目标url,地址栏带请求参数得问题了。