JSF应用程序的登录页面中的ViewExpiredException

时间:2012-04-03 13:36:15

标签: jsf viewexpiredexception

我有一个使用JSF1.2构建的应用程序。我有一个主页,其中包含一组命令链接。部署应用程序后,打开主页并单击任何这些菜单链接 - 我得到以下异常。但是,如果我导航到其他页面并返回页面并单击任何链接,则批准页面将打开。

  

javax.faces.application.ViewExpiredException:viewId:/home/home.jsf -   查看/home/home.jsf无法恢复。

web.xml具有以下过滤器 -

 <filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
    <init-param>
      <param-name>createTempFiles</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>maxRequestSize</param-name>
      <param-value>100000</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

2 个答案:

答案 0 :(得分:2)

如果页面实际上是从浏览器的缓存中加载的,或者如果您的Web应用程序在第一个请求的响应之后使会话无效,则会发生这种情况。由于后者是一种相当奇怪的编程方法,我怀疑它只是浏览器缓存。您需要创建一个过滤器来告诉浏览器不要缓存JSF请求。过滤器应映射到<servlet-name>的{​​{1}},并在FacesServlet方法中执行以下作业:

doFilter()

在使用新过滤器测试webapp之前,请不要忘记清除浏览器缓存。

另见:


对具体问题

无关,您遇到了一个主要的设计问题:您正在使用命令链接来执行页面到页面的导航。他们不是为了。命令链接将用于表单提交。您应该使用@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. res.setHeader("Pragma", "no-cache"); // HTTP 1.0. res.setDateHeader("Expires", 0); // Proxies. chain.doFilter(request, response); } 或普通的HTML <h:outputLink>元素进行页面到页面的导航。这样,页面将是可收藏的,searchbot-indexable,浏览器地址栏中的URL将不再是“落后一步”。另请参阅When should I use h:outputLink instead of h:commandLink?

答案 1 :(得分:1)

这不是一个错误 - 它是JSF的一个功能。当您的页面空闲一段时间时会发生这种情况,因此视图会过期。这有很多变通方法。试着阅读这篇非常好的帖子:JSF Odyssey – ViewExpiredException

希望它有所帮助。