【问题标题】:JSF Conversations ?cid - a right mess when someone bookmarks the page?JSF Conversations ?cid - 当有人为页面添加书签时会出现混乱吗?
【发布时间】:2011-12-10 16:51:21
【问题描述】:

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

【问题讨论】:

  • 这已经解决了,但我仍然想知道是否有更好的 - 不那么突兀(并且与容器实现的耦合更少)的方式。

标签: jsf-2 cdi jboss7.x


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 您好,能否请您进一步详细说明您为该问题找到的解决方案,也许是一些基本代码?
  • 我一年多前离开了那家公司,因此无法再访问代码。抱歉,上面的内容不太有用,因为现在阅读它我不确定我做了什么。
猜你喜欢
  • 2012-12-02
  • 2015-04-11
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2017-05-09
  • 2013-11-18
相关资源
最近更新 更多