1

我一直在为 JSF 2.0 中的 Flash-scope(我知道它不像其他“范围”,但通常被称为一个)而苦苦挣扎。(莫哈拉)

我的问题是 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-cookie。

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

4

2 回答 2

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 flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

放在:

flash.put("myObject", myObject);

要得到:

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

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

于 2012-07-19T15:40:24.780 回答
0

这并不能真正回答您的问题,但请查看此问题和注释 -在 post 在 JSF2 flash 范围中设置值后,在对页面的第二次 GET 请求时再次可见(Flash 范围被认为是有害的)

也许您应该改用RenderScoped(如果适用)?

于 2012-07-18T17:41:40.037 回答