3

在 JBoss AS7 中工作,使用 Conversation Scope 在浏览器选项卡中管理用户的交互。

我注意到我的页面附加了 ?cid 参数。这很棒 - 直到用户为页面添加书签然后尝试返回它!对话过滤器给出“没有这样的对话”消息。

有没有更好的管理对话的方法?也许是实现或切换以使其使用隐藏字段(在 AJAX 中适当注意)?或者,我将不得不开始尝试拦截对话异常或修改过滤器!

谢谢 - 理查德

更远:

我正在拦截 BeforeRestoreView 事件以用于其他目的(主要是登录处理)。你会认为这会起作用:

/**
 * @return true if there is no valid Conversation context.
 */
private boolean conversationNotActive()
{
    Context conversationContext = m_beanManager.getContext(ConversationScoped.class);
    return !conversationContext.isActive();
}

但我无法获得上下文来询问它是否处于活动状态!现在只会扔一个 Try-Catch 。

4

1 回答 1

2

我们现在采取两管齐下的方法。

一个相当复杂的对话管理器检测到错误的对话 ID 并采取适当的措施。它当前响应 After Restore View 事件。我想提前移动它,但在这个阶段派生视图 ID 时遇到问题。我编写了一个 JSF 到 CDI 的桥来将事件传递给 CDI。SeamFaces 也会这样做,但对我们来说太重了。

对于普通的 GET,对话管理器会在没有 cid 参数的情况下重定向到 self 以启动新的对话。对于回发,它会返回 HTTP 410 错误。死对话的检测如上。我们可以在创建对话时使用更随机的对话 ID,以尝试在重复使用 ID 时防止冲突。

对话管理器还将根据它保存的有关页面的元数据开始对话。(/forms/ 下的所有页面都需要在我们的应用程序中进行对话)。它在执行此操作时使用重定向以确保 CID 参数无处不在。如果我可以解决在 RestoreView 阶段之前获取表单 ID 的问题,这可能变得不必要了。

我们使用浏览器历史 API 从用户的浏览器 URL 窗口中删除 cid。

于 2011-11-11T17:16:10.077 回答