JSF Conversations?cid - 当有人为页面添加书签时,这是一个正确的混乱?

时间:2011-10-19 07:33:15

标签: jsf-2 cdi jboss7.x

在JBoss AS7中工作,使用会话范围在浏览器选项卡中管理用户的交互。

我注意到我的页面附加了?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。

1 个答案:

答案 0 :(得分:2)

我们现在采取双管齐下的方式。

非常复杂的会话管理器检测到错误的会话ID并采取适当的措施。它当前响应After Restore View事件。我想提前移动它,但在此阶段导出视图ID时遇到问题。我已经向CDI桥写了一个JSF来将事件传递给CDI。 SeamFaces会做同样的事情,但事实证明我们太重了。

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

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

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