在Glassfish3中使用跟踪模式URL的ViewExpiredException

时间:2013-05-29 11:00:30

标签: jsf primefaces glassfish-3

我们的客户不希望使用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上单击commandButton:POST时的预期行为,我的登录页面,重定向和Home.xhtml上的GET。

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

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

另一个更新: 与

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

会话将在回发时创建。但是我遇到了

java.io.NotSerializableException

2 个答案:

答案 0 :(得分:0)

另一个选项是将恢复视图兼容性设置为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实现。

答案 1 :(得分:0)

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

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

更新到2.1.22,一切正常。