首先我们常用的无非两种方式:
redirectAttributes.addAttributie("prama",value);
redirectAttributes.addFlashAttributie("prama",value);
这两种方法区别在哪里?
话不多说,上代码
一.redirectAttributes.addAttributie(“prama”,value)
这种方法直接将传递的参数暴露在链接地址上,非常的不安全,慎用。
@RequestMapping("/hello")
public String hello(RedirectAttributes attr){
attr.addAttribute("Name", "root");
attr.addAttribute("pwd","123456");
return "redirect:/demo/re";//"redirect:/demo/re1"
}
@ResponseBody
@RequestMapping("/demo/re1")
public String demoController1(String Name,String pwd){
System.out.println(Name + " " + pwd);
return "*************";
}
@ResponseBody
@RequestMapping("/demo/re")
public String demoController(HttpServletRequest request,ModelMap map,
@RequestParam(value = "Name",required = false) String userName,
@RequestParam(value = "pwd",required = false) String password){
System.out.println(userName + " " + password);
System.out.println(map.get("Name") + " " + map.get("pwd"));
System.out.println(request.getAttribute("Name") + " " + request.getAttribute("pwd"));
System.out.println(request.getParameter("Name") + " " + request.getParameter("pwd"));
return "*************";
}
通过两次转发请求/demo/re和/demo/re1
我们在浏览器输入:http://localhost:8080/demo/re?Name=root&pwd=123456
或http://localhost:8080/hello
控制台分别打印信息
root 123456
和
root 123456
null null
null null
root 123456
也就是说,通过addAttributie("prama",value)
这种方式传递的参数,可以通过自动参数绑定来获取值,或者根据@RequestParam
或request.getParameter
方式获取值
二.redirectAttributes.addFlashAttributie(“prama”,value)
redirectAttributes.addFlashAttributie("prama",value);
这种方法是隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的 “页面” 获取prama参数值。其原理就是放到session
中,session
在跳到页面后马上移除对象,所以你刷新一下后这个值就会丢掉。
@RequestMapping("/hello")
public String hello(RedirectAttributes attr){
attr.addFlashAttribute("Name", "root");
attr.addFlashAttribute("pwd","123456");
return "redirect:/demo/contro";
}
@ResponseBody
@RequestMapping("/demo/contro")
public String demoController(ModelMap map, HttpServletRequest request,
@RequestParam(value = "Name",required = false) String userName,
@RequestParam(value = "pwd",required = false) String password){
System.out.println("map : "+map.get("Name"));
System.out.println("request.getAttribute :" + request.getAttribute("Name"));
System.out.println("request.getParameter :" + request.getParameter("Name"));
System.out.println("@RequestParam : " + userName);
System.out.println("map : "+map.get("pwd"));
System.out.println("request.getAttribute :" + request.getAttribute("pwd"));
System.out.println("request.getParameter :" + request.getParameter("pwd"));
System.out.println("@RequestParam : " + password);
return "hello demoController";
}
结果:
map : root
request.getAttribute :null
request.getParameter :null
@RequestParam : null
map : 123456
request.getAttribute :null
request.getParameter :null
@RequestParam : null
我们可以看到:
在上述的过程中,只能通过ModelMap
或Map
获取参数的值
结论
网上说的利用@RequestParam
在控制器中获取参数的值只适用与addAttribute
方法,addFlashAttribute
只能通过ModelMap
获取值