我们的客户不希望使用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
答案 0 :(得分:0)
另一个选项是将恢复视图兼容性设置为true。
编辑您的web.xml并添加以下代码并尝试。
<context-param>
<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
<param-value>true</param-value>
</context-param>
<强>更新强>
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,一切正常。