【问题标题】:JSF 2.0 Flash-scope - cookie pathJSF 2.0 Flash 范围 - cookie 路径
【发布时间】:2012-07-10 09:15:42
【问题描述】:

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

我的问题是 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 首先应该绑定到视图的路径。

【问题讨论】:

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


    【解决方案1】:

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

    是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 时。

    【讨论】:

    • >你的一个假设是不正确的: - 它不是不正确的。由于一个错误(实际上有几个),这确实是 Mojarra 中发生的事情。
    【解决方案2】:

    这并不能真正回答你的问题,但看看这个问题和笔记 - 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(如果适用)?

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2011-07-28
      • 2012-08-03
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多