JSF应用程序登录页中的ViewExpiredException

JSF应用程序登录页中的ViewExpiredException,jsf,viewexpiredexception,Jsf,Viewexpiredexception,我有一个使用JSF1.2构建的应用程序。我有一个主页,其中有一组命令链接。部署应用程序后,当打开主页并单击这些菜单链接中的任何一个时,会出现以下异常。但是,如果我导航到其他页面并返回页面并单击任何链接,则AppPeriate页面将打开 javax.faces.application.ViewExpiredException:viewId:/home/home.jsf- 无法还原View/home/home.jsf web.xml具有以下筛选器- <filter> <f

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

javax.faces.application.ViewExpiredException:viewId:/home/home.jsf- 无法还原View/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>

接缝过滤器
org.jboss.seam.servlet.SeamFilter
创建临时文件
假的
最大请求大小
100000
接缝过滤器
Facesservlet
向前地
要求
包括
错误

这不是一个bug-它是JSF的一个特性。当您的页面空闲一段时间,视图过期时,就会发生这种情况。这方面有很多解决办法。尝试阅读这篇非常好的帖子:


希望能有所帮助。

这不是一个bug,而是JSF的一个特性。当您的页面空闲一段时间,视图过期时,就会发生这种情况。这方面有很多解决办法。尝试阅读这篇非常好的帖子:


希望有帮助。

如果页面实际上是从浏览器的缓存加载的,或者如果您的web应用程序在响应第一个请求后在某处使会话无效,则可能会发生这种情况。由于后者是一种相当奇怪的编程方法,我怀疑它只是浏览器缓存。您需要创建一个过滤器来告诉浏览器不要缓存JSF请求。过滤器应映射到
FacesServlet
,并在
doFilter()
方法中执行以下工作:

@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);
}
在使用新过滤器测试webapp之前,不要忘记清除浏览器缓存

另见:


与具体问题无关您遇到了一个主要的设计问题:您使用命令链接执行页面到页面的导航。它们不是为你准备的。命令链接用于表单提交。您应该使用
或普通HTML

,如果页面实际上是从浏览器的缓存加载的,或者如果您的web应用程序在响应第一个请求后在某个地方使会话无效,则可能会发生这种情况。由于后者是一种相当奇怪的编程方法,我怀疑它只是浏览器缓存。您需要创建一个过滤器来告诉浏览器不要缓存JSF请求。过滤器应映射到
FacesServlet
,并在
doFilter()
方法中执行以下工作:

@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);
}
在使用新过滤器测试webapp之前,不要忘记清除浏览器缓存

另见:


与具体问题无关您遇到了一个主要的设计问题:您使用命令链接执行页面到页面的导航。它们不是为你准备的。命令链接用于表单提交。您应该使用
或普通HTML

,非常感谢您详细而有用的回复。我在应用程序中已经有了一个过滤器,但不确定它是否应该清除缓存。我已经在我原来的帖子中添加了这个过滤器。你是Java web开发新手吗?你可以在你的webapp中有多个过滤器。我不确定现有的过滤器是做什么的-所以有点困惑。此应用程序工作正常,没有此问题。我将其转换为一个maven项目,并从repo中添加了所有依赖项jar。一旦我这样做了,应用程序就成功地构建了——但是我遇到了这个问题。所以当我把它转换成一个maven项目时,我想我遗漏了一些东西。一个过滤器不是另一个过滤器。过滤器并不总是按定义添加指示浏览器禁用缓存的标题。这取决于过滤器的实现。您只需创建另一个。非常感谢您的详细和有用的回复BalusC。我在应用程序中已经有了一个过滤器,但不确定它是否应该清除缓存。我已经在我原来的帖子中添加了这个过滤器。你是Java web开发新手吗?你可以在你的webapp中有多个过滤器。我不确定现有的过滤器是做什么的-所以有点困惑。此应用程序工作正常,没有此问题。我将其转换为一个maven项目,并从repo中添加了所有依赖项jar。一旦我这样做了,应用程序就成功地构建了——但是我遇到了这个问题。所以当我把它转换成一个maven项目时,我想我遗漏了一些东西。一个过滤器不是另一个过滤器。过滤器并不总是按定义添加指示浏览器禁用缓存的标题。这取决于过滤器的实现。你只需要再创建一个。