【问题标题】:Random JSF error: no saved view state could be found随机 JSF 错误:找不到保存的视图状态
【发布时间】:2013-09-30 07:07:17
【问题描述】:

我有一个非常奇怪的错误:找不到视图标识符的已保存视图状态:/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 的公共 void 方法。
3. 是的,该方法是无效的,因为我不需要返回一个字符串来重定向到另一个页面。我需要重定向到 /page/id(例如:/market/24、/profile/43),因此返回字符串作为导航目的地的方法是无用的,因为我使用: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)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 嗨!正如您也提到的,它与重新启动无关。正如我在帖子中所解释的那样,mypage.xhtml?faces-redirect=true 对于漂亮的 URL 没有用。示例:您如何使用这种方式重定向到:/mypage/ID1/ID2?其次,在 web.xml (302400) 中将会话超时设置为 30 天。对于随机用户,该错误是随机发生的,但所有用户都没有使用该系统已有 30 天,所以有点奇怪。还有其他想法吗?
    • 如何在 GET 中获得“无法找到视图标识符的已保存视图状态:”?我很确定这与您调用重定向的方式有关。
    • 它不会发生在 GET 上。我已经提到了以下内容:第2步:用户单击命令btn,第3步:btn连接到一个方法,第4步:出现问题,因此没有执行方法(少于10〜的案例......非常随机反正)。由于这个 No state 错误,甚至没有达到它的方法。
    • 但是重定向是 GET,对吧?因此,该代码有效地破坏了 JSF 生命周期。它不起作用,因为它不应该起作用。
    • 是的,重定向是一个GET,但事实并非如此,因为命令按钮的方法根本没有执行,所以JSF没有到达那行代码(重定向)。跨度>
    【解决方案2】:

    在对 MyFaces 和 Tomee 论坛/邮件列表进行了长时间讨论之后,我设法消除了这个问题:我切换这个项目中的 JSF 实现到 Majorra 2.1.26。直到现在该错误才出现。

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

    提及:这不是许多 JSF 开发人员得到的基本“找不到保存的视图状态”。那是隐藏在某个地方的其他东西。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 2013-11-08
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多