DD.*_*DD. 5 jsf back-button html-post browser-refresh
我有一个JSF页面,它将数据发布到外部页面.数据从JSF托管bean加载,该bean在post数据中生成唯一ID.
我有一个问题,用户点击结帐按钮然后导航回同一页面并再次按下结帐按钮.帖子数据尚未更新.而且,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>
Run Code Online (Sandbox Code Playgroud)
该页面可能是从浏览器缓存加载的.这基本上是无害的,但确实让最终用户感到困惑,因为他/她错误地认为它确实来自服务器.您可以通过查看浏览器Web开发人员工具集中的HTTP流量监视器轻松确认这一点(按Chrome/FireFox23 +/IE9 +中的F12并选中"网络"部分).
你基本上需要告诉浏览器不要缓存(动态)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);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
/app/*您要关闭浏览器缓存的示例网址格式在哪里?如有必要,可以映射它/*,*.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>
Run Code Online (Sandbox Code Playgroud)
另见展示.
小智 6
我找到了一个适用于 JSF 的解决方案,而无需创建 servlet-filter。只需将下面的行放入您的 .xhtml 页面即可。
<f:event type="preRenderView" listener="#{facesContext.externalContext.response.setHeader('Cache-Control', 'no-cache, no-store')}" />
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9754 次 |
| 最近记录: |