随机JSF错误:找不到保存的视图状态

时间:2013-09-24 21:19:02

标签: jsf jsf-2 java-ee-6 myfaces tomee

我有一个非常奇怪的错误:找不到视图标识符的已保存视图状态:/mypage.xhtml
问题在于,它只是〜10%的用户/执行随机出现。

应用程序服务器:Apache Tomee 1.5.2 stable / 1.6.0-2013.09.20 dev(两者都发生)。我使用每个附带的MyFaces发行版,所以2.1.10 / 2.1.12,所以没有新添加。

web.xml的一部分:

      <context-param>
        <param-name>org.apache.myfaces.USE_ENCRYPTION</param-name>
        <param-value>false</param-value>
      </context-param>
      <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
      </context-param>

因此,不应该发生状态视图异常,因为状态在客户端上。它之前设置在服务器上,但我想也许客户端会修复它,但没有。实际上,该错误的发生没有差异。

执行流程:
1.客户打开xhtml页面(JSF) 2.客户端点击命令按钮执行各种操作,按钮连接到JSF @ViewScoped ManagedBean的public void方法。 3.是的,该方法是无效的,因为我不需要返回一个String来重定向到另一个页面。我需要重定向到/ page / id(例如:/ market / 24,/ profile / 43),因此返回String作为导航目标的方法是无用的,因为我使用:FacesContext.getCurrentInstance().getExternalContext().redirect(path);
4.在大约90%的情况下,一切都运行良好,用户被重定向到每个特定页面。在其余的~10(随机)中,他们得到No saved view state could be found for the view identifier: /pagename.xhtml

我真的很感激这里有一些帮助,因为我不知道如何解决这个问题 非常感谢。

PS。我使用PrimeFaces,我在web.xml中也有一些自己的过滤器,但这不应该是一个问题,我希望如此。

其中一个页面的堆栈跟踪:

25-Sep-2013 07:39:26.380 SEVERE [http-bio-80-exec-15] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Faces Servlet] in context with path [] threw exception [/dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.xhtml] with root cause
 javax.faces.application.ViewExpiredException: /dashboard/edit-profile.xhtmlNo saved view state could be found for the view identifier: /dashboard/edit-profile.xhtml
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:132)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:77)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:199)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.ActivateAccountFilter.doFilter(ActivateAccountFilter.java:37)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.SecurityFilter.doFilter(SecurityFilter.java:36)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at com.pingushare.boundary.filter.ForceFreshPageAndWWWFilter.doFilter(ForceFreshPageAndWWWFilter.java:49)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:724)

2 个答案:

答案 0 :(得分:0)

这个问题很好理解,因为如果重新启动服务器或重新部署应用程序,默认情况下会生成新的加密密钥。解决方案是生成您自己的密钥并将其设置在您的web.xml文件中。这样,MyFaces将始终使用相同的密钥。见http://wiki.apache.org/myfaces/Secure_Your_Application

该描述声称加密被禁用,我已经检查了代码,它没问题,它按预期工作(加密被有效禁用)。如果加密不是问题,我的意见是您的应用程序逻辑中存在错误。不要以这种方式调用重定向,使用mypage.xhtml使用标准格式?faces-redirect = true。该问题可能是由会话到期引起的(注意只有视图范围bean在2.0 / 2.1中转到客户端,但会话范围bean已过期)。

答案 1 :(得分:0)

经过对MyFaces和Tomee论坛/邮件列表的长时间讨论,这就是我设法消除这个问题的方法:我将此项目中的JSF实施切换到Majorra 2.1.26。直到现在,错误才再出现。

由于这个bug没有任何意义(检查我的项目和MyFaces的来源后)并且无法复制,我们实际上无法找到它的修复,但至少它不会发生在Majorra,所以如果其他人得到这个错误,这可能会有所帮助。

提及:这不是许多JSF开发人员获得的基本“未保存的视图状态”。那是隐藏在某处的东西。