强制JSF当通过链接或后退按钮打开刷新网页/视图/表格(Force JSF to refresh p

2019-07-17 17:18发布

我有一个JSF网页,其中数据发布到外部网页。 该数据从该在后的数据生成一个唯一的ID的JSF托管bean加载。

我有一个问题,即在结账按钮,用户点击然后导航回到同一页面,再次按下结帐按钮。 POST数据尚未更新。 此外,豆是不是在所有调用。 反正是有强制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>

Answer 1:

该网页很可能正在从浏览器缓存加载。 这基本上是无害的,但确实迷惑终端用户,因为他/她错误地认为它真的来自服务器。 您可以轻松地在浏览器的web开发工具包查看HTTP流量监控证实了这一点(按F12在Chrome / FireFox23 + / IE9 +,并检查“网络”部分)。

你基本上需要告诉浏览器不缓存(动态)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)) { // 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);
    }

    // ...
}

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

又见展示 。



Answer 2:

我发现,而无需创建一个servlet过滤器用于JSF有效的解决方案。 只要把线下到你的页面.xhtml。

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


文章来源: Force JSF to refresh page / view / form when opened via link or back button