该页面 likely 是从浏览器缓存加载的。这基本上是无害的,但确实会让最终用户感到困惑,因为他/她错误地认为它确实来自服务器。您可以通过查看浏览器的 web 开发工具集中的 HTTP 流量监视器(在 Chrome/Firefox23+/IE9+ 中按 F12 并检查 "Network" 部分)轻松确认此操作。
您基本上需要告诉浏览器不要缓存(动态)JSF 页面。这样,浏览器将实际向服务器请求页面(从而触发受管 bean 的正确创建/初始化),而不是从其缓存中显示先前请求的页面。
通常,这可以通过一个简单的servlet 过滤器 来完成,如下所示:
@WebFilter("/app/*")
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
}
chain.doFilter(req, res);
}
}
这里的/app/*
是您想要关闭浏览器缓存的示例URL模式。如有必要,您可以将其映射到/*
、*.xhtml
或甚至servletNames={"Faces Servlet"}
。
如果您使用JSF实用程序库OmniFaces,则可以使用其内置的CacheControlFilter
,只需将以下条目添加到web.xml
中即可(该示例直接映射到FacesServlet
,这意味着每个动态JSF页面都不会被缓存):
<filter>
<filter-name>noCache</filter-name>
<filter-class>org.omnifaces.filter.CacheControlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>noCache</filter-name>
<servlet-name>facesServlet</servlet-name>
</filter-mapping>
请参阅演示。
chain.doFilter(request, response);
而不是chain.doFilter(req, res);
,对吗? - Hendrik