JSF 2.0 Flash-scope - cookie路径

时间:2012-07-10 09:15:43

标签: jsf-2 servlet-filters flash-scope

我一直在使用Flash-scope (我知道它不像其他人那样“范围”,但在JSF 2.0中通常被称为“范围”)。 (Mojarra)

我的问题是flash-cookie被绑定到视图的路径,将对象放入flash中 这导致在重定向到同一应用程序中的不同路径后对象不可用。 我们需要在重定向导航的另一端提供字符串(可能还有对象)。

我已经实现了一个@WebFilter,目的是覆盖它并用以下包装替换ServletResponse

private class ResponseWrapper extends HttpServletResponseWrapper{

    private final String path;

    public ResponseWrapper(HttpServletResponse response, String contextpath) {
        super(response);
        this.path = contextpath;
    }

    @Override
    public void addCookie(Cookie cookie) {

        // Hardcoded name from jsf-impl # com.sun.faces.context.flash.ELFlash  
        final String FLASH_COOKIE_NAME = "csfcfc";

        if (cookie.getName().equals(FLASH_COOKIE_NAME)){
            cookie.setPath(path);
        }
        super.addCookie(cookie);
    }

}

实际上,这个包装器将修改flash-cookies以绑定到应用程序context-root。

我的问题是,这是否会引起我不会监督的其他问题 我无法理解为什么Flash应该首先绑定到视图的路径。

2 个答案:

答案 0 :(得分:2)

您的一个假设是不正确的:

  

是flash-cookie绑定到视图的路径,将对象放入flash中。

事实证明,Flash范围只能保留一次重定向。

  

换句话说,放置在Flash作用域中的对象将在重定向后继续存在。   http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

如果你搞乱了cookie和过滤器,你可能做错了什么。 JSF将这些概念抽象出来,这样您就可以使用POJO来完成您的工作。不要乱用Java EE cookie,你要做的工作比你需要的多得多,而且你会立即创建非常脆弱的代码。

要使用闪存范围,请按以下方式获取对它的引用:

Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

放下:

flash.put("myObject", myObject);

获取:

Object myObject = flash.get("myObject");

你的hack会导致JSF出现问题吗?我肯定会说,如果不是现在,那么稍后当你尝试升级Mojarra时,请使用不同的容器,或者切换到MyFaces。

答案 1 :(得分:0)

这并没有真正回答你的问题,而是看着这些问题和笔记 - After post is setting a value in JSF2 flash scope, it is visible again on second GET request to a page (Flash scope considered harmful)

也许您应该使用RenderScoped代替(如果适用)?