Spring RedirectAttributes:addAttribute()与addFlashAttribute()


74

到目前为止,我对控制器请求映射方法的理解是,我们可以指定RedirectAttributes参数,并在请求重定向时使用属性填充该参数。

范例

@RequestMapping(value="/hello", method=GET)
public String hello(RedirectAttributes redirAttr)
{
   // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ?

   // ...

   return "redirect:/somewhere";
}

然后,重定向属性将在重定向到的目标页面上可用。

但是,RedirectAttributes类具有两种方法:

已经阅读了一段时间的Spring文档,但是我有点迷茫。两者之间的根本区别是什么,我应该如何选择使用哪一个?

Answers:


103

这里是区别

  • addFlashAttribute()实际上将属性存储在flashmap中 (在内部由用户维护,在session满足下一个重定向请求后将其删除)

  • addAttribute()本质上是根据您的属性构造请求参数,然后使用请求参数重定向到所需的页面。

因此,优势addFlashAttribute()将是你可以几乎任何对象存储在您的闪光属性(因为它不序列化到所有请求参数,而是保持为对象),而与addAttribute()因为您添加被转换成一个正常的对象请求参数,您非常受限于像String或图元这样的对象类型。


8
你好 我有一个问题是RedirectAttributes是否会影响SessionAttribute?
muthu 2013年

是否可以通过查询参数拒绝重定向属性的覆盖?此功能是否默认实现?
vdenotaris 2014年

为什么addAttribute方法具有签名(字符串,对象)?
gstackoverflow

很好的解释,如果您使用“ addAttribute”,则可以在浏览器地址位置找到该参数。
弥敦道

17

假设您有2个控制器。如果从一个控制器重定向到另一个控制器,则模型对象中的值将在另一个控制器中不可用。因此,如果要共享模型对象值,则必须在第一个控制器中说

addFlashAttribute("modelkey", "modelvalue");

然后,第二个控制器的模型现在包含上述键值对。

第二个问题?有什么区别addAttributeaddFlashAttributeRedirectAttributes

addAttribute会将值作为请求参数而不是模型传递,因此当您使用添加参数时addAttribute,可以从request.getParameter

这是代码。我习惯于找出正在发生的事情:

@RequestMapping(value = "/rm1", method = RequestMethod.POST)
public String rm1(Model model,RedirectAttributes rm) {
    System.out.println("Entered rm1 method ");

    rm.addFlashAttribute("modelkey", "modelvalue");
    rm.addAttribute("nonflash", "nonflashvalue");
    model.addAttribute("modelkey", "modelvalue");

    return "redirect:/rm2.htm";
}


@RequestMapping(value = "/rm2", method = RequestMethod.GET)
public String rm2(Model model,HttpServletRequest request) {
    System.out.println("Entered rm2 method ");

    Map md = model.asMap();
    for (Object modelKey : md.keySet()) {
        Object modelValue = md.get(modelKey);
        System.out.println(modelKey + " -- " + modelValue);
    }

    System.out.println("=== Request data ===");

    java.util.Enumeration<String> reqEnum = request.getParameterNames();
    while (reqEnum.hasMoreElements()) {
        String s = reqEnum.nextElement();
        System.out.println(s);
        System.out.println("==" + request.getParameter(s));
    }

    return "controller2output";
}

7

Javadoc描述: “ FlashMap为一种请求提供了一种存储要在另一种属性中使用的属性的方法。从一个URL重定向到另一个URL时,这通常是最需要的,例如Post / Redirect / Get模式。FlashMap在保存之前重定向(通常在会话中),并在重定向后可用并立即删除。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.