0

我正在使用 Mojarra 2.1.3、NetBeans 7.0.1、Primefaces 3.2。

我的应用程序中有一些由 ViewScoped 支持 bean 支持的动态 xhtml 页面。每个页面都有 p:dataTable 显示来自 backing bean 的 List<>。当用户导航到包含数据表中每个项目的详细信息的不同页面时,就会出现此问题。在浏览详细信息时,用户很可能会点击浏览器的后退按钮以返回列表。所以我在我的应用程序中实现了这样的过滤器。

    @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest httpReq = (HttpServletRequest) request;
    HttpServletResponse httpRes = (HttpServletResponse) response;
    if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
        httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
        httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
        httpRes.setDateHeader("Expires", 0); // Proxies. 
    }
    chain.doFilter(request, response);
}

但是我有一个问题,正如这里所解释的:当会话到期时如何将用户移动到超时页面,如果用户单击浏览器后退按钮,浏览器应该改为向服务器发送一个完全值得的新 HTTP 请求。

但就我而言,它没有。相反,我看到无处不在的网页已过期,我认为这不是用户友好的体验。我想要的不是从浏览器缓存中加载它,而是向服务器创建一个新请求并显示正确的页面(不是网页有过期页面)。是否可以。

请帮忙。非常感谢。

4

1 回答 1

0

如果导航是通过 POST 请求而不是 GET 请求进行的,则可能会发生这种情况。

您应该确保页面到页面的导航始终通过 GET 请求进行。例如

<p:dataTable value="#{bean.items}" var="item">
    <p:column>
        <h:link value="detail" outcome="detail">
            <f:param name="id" value="#{item.id}" />
        </h:link>
    </p:column>
</p:dataTable>
于 2012-07-18T14:19:33.517 回答