成功踩坑RedirectAttributes,望大家引以为戒

首先我们常用的无非两种方式:

  • 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=123456http://localhost:8080/hello
控制台分别打印信息

root 123456

root 123456
null null
null null
root 123456

也就是说,通过addAttributie("prama",value)这种方式传递的参数,可以通过自动参数绑定来获取值,或者根据@RequestParamrequest.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

我们可以看到:
在上述的过程中,只能通过ModelMapMap获取参数的值

结论

网上说的利用@RequestParam在控制器中获取参数的值只适用与addAttribute方法,addFlashAttribute只能通过ModelMap获取值

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值