我有一个使用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>
答案 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
希望它有所帮助。