1

我们的客户不希望使用 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 上发布,我的登录页面,在 Home.xhtml 上重定向和 GET。

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

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

另一个更新:有

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

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

java.io.NotSerializableException

.

4

2 回答 2

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;相反,如果旧视图已过期,只需创建一个新视图。”

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

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

默认的 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 实现。

于 2013-05-29T14:54:01.780 回答
0

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

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

更新到 2.1.22,一切正常。

于 2013-06-04T10:25:13.867 回答