Flash范围对象正在迷失

时间:2012-09-21 21:35:28

标签: jsf-2 primefaces glassfish-3 mojarra

我有一个JSF页面,显示一个名为 TableQuery 的对象的表,它支持有状态的分页,排序等。访问该对象的bean是一个RequestScoped对象,它试图保留 TableQuery 通过存储flash地图。访问器方法如下所示:

public TableQuery<SysLog> getQuery() {
    if (query != null) return query;
    Flash flash = FacesContext.getCurrentInstance().
            getExternalContext().getFlash();
    query = (TableQuery) flash.get("Query");
    if (query != null) System.out.println("TableSysLog.getQuery() Got query from flash!");
    if (query == null) {
        query = slc.getNewTableQuery();
        System.out.println("TableSysLog.getQuery() Created new query");
    }
    flash.put("Query", query);
    return query; }

页面之间的链接使用 p:commandLInk 实现。我在AJAX模式下使用Primefaces命令链接,因此只需点击链接即可处理链接。动作监听器如下所示:

public void doNextPage(ActionEvent evt) {
    getQuery().doNextPage();
}

当它不起作用时,我收到错误消息:

WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash.  Any values stored to the flash will not be available on the next request.

我在查找此问题时找到了this thread。当文章建议我转向HTTP分块时,错误消息消失但问题仍然存在。

有谁知道发生了什么以及如何解决这个问题?

更新:

在处理这个问题时,我相信我已经发现了一个用于存储flash对象的cookie的错误。它存储的cookie名为 csfcfc ,cookie的路径参数是我的应用程序的根目录,在我的情况下是“/ A /”。

然而,当它失败时,我得到第二个 csfcfc cookie,这次使用path参数为“/ A //”。我的工作原理是cookie生成器有时会在path参数中添加一个额外的“/”,这意味着即使浏览器发送了cookie,也不会在下一个请求中看到cookie。

值得注意的是,这种情况非常间歇性地发生。我并不总是得到 JSF1095 消息,但每次看的时候我都会得到额外的cookie。

我不知道这是一个Mojarra bug还是Glassfish bug,但我在这篇文章中添加了Mojarra标签。我不熟悉这些产品的bug数据库,但是有人可以在这里评论下一步应该是什么吗?

我很感激任何关于

的建议

1 个答案:

答案 0 :(得分:0)

事实证明问题出在Glassfish的协议处理中,正如问题中提供的链接所示。如果关闭HTML“分块”模式,则此问题就会消失。

最初我认为事实并非如此,但事实上我还有另一个导致flash对象丢失的错误。