在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。
答案 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。