强制JSF通过链接或后退button打开时刷新页面/视图/表单

我有一个JSF页面,将数据发布到外部页面。 这些数据是从一个JSFpipe理的bean中加载的,后者在后期数据中生成一个唯一的ID。

我有一个问题,用户点击结帐button,然后导航回到同一页面,再次按结账button。 post数据没有更新。 而且,这个bean根本就没有被调用。 有没有办法强制JSF重新加载页面和表单数据?

<form action="#{checkoutBean.externalUrl}" method="post" id="payForm" name="payForm"> <input type="hidden" value="#{checkoutBean.uniqueID}" /> <input type="submit" value="Proceed to Checkout" /> </form> 

该页面可能正从浏览器caching中加载。 这基本上是无害的,但是对最终用户来说确实很混乱,因为他/她错误地认为它确实来自服务器。 您可以通过查看浏览器Web开发人员工具集中的HTTPstream量监视器(在Chrome / FireFox23 + / IE9 +中按F12并选中“networking”部分)来轻松确认。

你基本上需要告诉浏览器不要caching(dynamic)的JSF页面。 通过这种方式,浏览器实际上会向页面请求服务器(从而触发托pipebean等的正确创build/初始化),而不是从caching中显示先前请求的页面。

一般来说,这是通过一个简单的servletfilter完成的,如下所示:

 @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)) { // Skip JSF resources (CSS/JS/Images/etc) response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. response.setHeader("Pragma", "no-cache"); // HTTP 1.0. response.setDateHeader("Expires", 0); // Proxies. } chain.doFilter(req, res); } // ... } 

Where /app/*是您想要closures浏览器caching的示例URL模式。 你可以根据需要将它映射到/**.xhtml甚至servletNames={"Faces Servlet"}

如果碰巧使用JSF实用程序库OmniFaces ,那么只需将以下条目添加到web.xml即可使用其内置的CacheControlFilter (它演示了FacesServlet上的直接映射,这意味着每个dynamicJSF页面都不会被caching):

 <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> 

另见展示 。

我find了一个适用于JSF的解决scheme,而不必创build一个servletfilter。 只要把下面的行放到你的.xhtml页面。

 <f:event type="preRenderView" listener="#{facesContext.externalContext.response.setHeader('Cache-Control', 'no-cache, no-store')}" />