重定向到JSP页面时使用flash属性

重定向到JSP页面时使用flash属性,jsp,spring-mvc,Jsp,Spring Mvc,我的MVC控制器有以下情况 for (String key : form.keySet()) redirectAttrs.addFlashAttribute(key, form.getFirst(key)); return "redirect:" + page; page是/secure/admin/pages/userPreferences.jsp,我在flash属性中添加了一个username属性 从JSP页面,我如何访问usernameflash属性。但

我的MVC控制器有以下情况

    for (String key : form.keySet())
        redirectAttrs.addFlashAttribute(key, form.getFirst(key));

    return "redirect:" + page;
page
/secure/admin/pages/userPreferences.jsp
,我在flash属性中添加了一个
username
属性

从JSP页面,我如何访问
username
flash属性。但我不知道怎么做

我尝试了
${param.username}
${username}
但都没有成功。我试图转储所有
${param}
和请求属性,但在JSP中找不到任何内容


类似问题:-区别在于他们希望从MVC控制器而不是从JSP视图读取flash属性

解决方法:如果我使用
redirectAttrs.addAttribute
而不是
addFlashAttribute
,我会得到两种效果:

  • JSP页面将看到
    ${param.username}
    ,并相应地执行操作
  • 我在查询字符串中得到该用户名(例如,
    userPreferences.jsp?username=jdoe
    ),这并不令人兴奋,但实际上允许刷新页面

  • 这是一种解决方法,因为我更喜欢让参数不可见,这是使用flash属性的主要原因。

    如果重定向,将调用另一个控制器

    您可以做的是将闪现的参数作为普通模型属性进行传输:

    @RequestMapping(method = RequestMethod.GET)
    protected String get(HttpServletRequest request, Model model) { // redirect request
    
        Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
        if (inputFlashMap != null) {
            String name = (String) inputFlashMap.get("username");
            model.addAttribute("username", name);
        }
    
        return "page";
    }
    
    不幸的是,属性名称中的点不允许您直接访问地图。您必须使用

    public static Map<String, ?> getInputFlashMap(HttpServletRequest request) {
        return (Map<String, ?>) request.getAttribute(DispatcherServlet.INPUT_FLASH_MAP_ATTRIBUTE);
    }
    
    public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + ".INPUT_FLASH_MAP";