【问题标题】:ViewExpiredException with tracking mode URL in Glassfish3Glassfish3 中带有跟踪模式 URL 的 ViewExpiredException
【发布时间】:2013-05-29 11:00:29
【问题描述】:

我们的客户不希望使用 cookie 进行会话处理,这也会导致 Apache/mod_rewrite 网关出现问题,所以我尝试使用

<tracking-mode>URL</tracking-mode>

在我们的 web.xml 中。 Glassfish3/Servlet 3.0 应该就是这些了。但是现在我在尝试登录时收到 ViewExpiredExceptions(这不是 AJAX 请求):

<p:commandButton id="submit"
                 value="${msg['Login.submit.label']}"
                 action="#{loginBean.login}"
                 ajax="false"/>

我还尝试将会话保存在客户端,而不是在 URL 中看到 JSESSIONID,但这会为我的@EJB 引发 NotSerializableExceptions。有任何想法吗?我想念什么吗?它曾经与 cookie 一起工作得很好。

更新:LoginBean.login 返回“Home.xhtml?faces-redirect=true”,单击命令按钮时的预期行为:在 Login.xhtml 上发布 POST,我的登录页面,在 Home.xhtml 上重定向和 GET。

第二次更新: 看起来我的操作永远不会被调用,我直接得到 ViewExpiredException 和 HTTP 500 错误代码。

第三次更新: 看起来 HttpSession 始终为空,跟踪模式设置为 URL,使用 cookie 正确创建了 HttpSession。如果没有会话,FacesServlet 不应该创建会话并在 URL 中附加 JSESSIONID 吗?

另一个更新: 与

<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>

会话将在回发时创建。但比我遇到的

java.io.NotSerializableException

.

【问题讨论】:

  • 你的 backbean viewscoped 了吗?
  • @Makky LoginBean 是 RequestScoped 但将其更改为 ViewScoped 也无济于事。

标签: jsf primefaces glassfish-3


【解决方案1】:

另一个选项是将恢复视图兼容性设置为 true。

编辑您的 web.xml 并添加以下代码并尝试。

<context-param>
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
    <param-value>true</param-value>
</context-param>

更新:

Reference

com.sun.faces.enableRestoreView11Compatibility 是一个 JSF 1.2 设置,它告诉 JSF 1.2 的行为类似于 JSF 1.1。

com.sun.faces.enableRestoreView11Compatibility == true 表示“不要抛出 ViewExpiredException;相反,如果旧视图已过期,只需创建一个新视图。”

关于 JSF 1.1 行为的 IBM 注释说:

这可能会产生不良行为,因为它是一个新视图,并且通常在视图中的项目(例如状态)不再存在。

默认的 JSF 1.2 行为在规范中定义如下:

如果请求是回发,则调用 ViewHandler.restoreView(),传递当前请求的 FacesContext 实例和视图标识符,并为恢复的视图返回 UIViewRoot。如果 ViewHandler.restoreView() 的返回为 null,则抛出带有相应错误消息的 ViewExpiredException。 javax.faces.application.ViewExpiredException 是一个 FacesException`,必须抛出该异常以向应用程序发出未返回视图标识符的预期视图的信号。应用程序可能会根据此异常选择执行某些操作。

要在视图过期时引发 ViewExpiredException,请删除 com.sun.faces.enableRestoreView11Compatibility 参数或将其设置为 false。

com.sun 命名空间表明该参数是 Sun/Mojarra 和派生的特定于实现的设置,因此它可能不适用于所有 JSF 实现。

【讨论】:

  • 这个参数意味着什么?我应该注意的任何缺点/含义?这听起来更像是一种解决方法,这是否意味着我做的一切都是正确的,但我遇到了一些错误?
  • 这是一种变通方法,请参阅我的更新答案以获取更多信息。
  • 不幸的是,这没有帮助,我现在停留在我的登录页面上,而没有被重定向到主页。 LoginBean.login 返回“/Home.xhtml?faces-redirect=true”,但我看不到重定向,只有登录页面 Login.xhtml 上的 POST。
  • 用附加信息更新了原始问题。 @BalusC
  • Hendrik,我没有回答这个问题,我只是编辑了答案并修复了一些错误的格式。看,我的名字是在“编辑”之后而不是在“回答”之后。单击“已编辑”链接可以看到我所做的任何事情。
【解决方案2】:

已通过更新 Mojarra 修复。我的 Glassfish 3.1.2.2 带有 Mojarra 2.1.6 和这个错误:

https://java.net/jira/browse/JAVASERVERFACES-2143

更新到 2.1.22,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多