【问题标题】:Avoid ViewExpiredException in JSF 1.2 on a single page在单个页面上避免 JSF 1.2 中的 ViewExpiredException
【发布时间】:2016-06-18 08:54:53
【问题描述】:

我有一个未受保护的登录页面,可通过不同的导航案例访问。

问题:许多用户访问该登录页面并使其打开一段时间,然后再次登录。繁荣!可怕的 ViewExpiredException 发生了!我想避免 ViewExpiredException 让他们再次登录。我不想要所有视图的解决方法,而只是页面上的标志。

我无法迁移到 JSF2(出于预算原因)。

我有这个配置:

javax.faces.STATE_SAVING_METHOD = server

这是我无法改变的(我们有一个有限的带宽和机制来阻止比输入字段非常有限的小表单页面更大的 http 请求。

有什么想法吗?

【问题讨论】:

  • 如果您使用的是 Mojarra(不是 MyFaces),您只能通过将上下文参数 com.sun.faces.enableRestoreView11Compatibility 设置为 true 为整个应用程序(而不是单个页面)配置它。这可以接受吗?
  • 好吧,也许吧!当视图过期时,其他页面会发生什么?我会像您在之前的帖子中所说的那样获得一些“WTF”经验吗?
  • 仅当您依赖于视图作用域状态时,但在 JSF 1.x 中,“视图作用域”已经不作为托管 bean 作用域存在。如果您使用类似 Tomahawk 的 来模拟 JSF 2.x 视图范围,那么它可能会以“WTF”体验结束,因为 引用的 bean 将从头开始重建,而不是当视图过期时重用(所以你得到一个全新的 bean,而不是错误页面)
  • 好的,enableRestoreView11Compatibility 的有趣之处在于它重新呈现了登录页面,而不是遵循我的应用程序中定义的导航规则。所以我最终再次进入我的登录页面..但没有 ViewExpiredException :(
  • 嗯。另一种方法是保留它并使用纯 HTML
    结合简单的 servlet。

标签: jsf jsf-1.2 viewexpiredexception


【解决方案1】:

我无法让我的登录页面脱离 JSF 上下文,因为我的登录页面中有一大堆行为取决于 JSF 上下文。

我终于用一个肮脏的黑客解决了这个问题。在 RestoreViewPhase 侦听器中,我检测到当前视图已过期,我将所有参数从 HTTP 请求中取出并放入会话托管 bean。

然后,当我返回登录页面时,一些 javascript 会自动重新提交表单以及新视图。

相当老套,但它有效。

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2013-02-25
    • 2011-09-03
    相关资源
    最近更新 更多