2012-07-18 49 views
0

使用Mojarra 2.1.3,NetBeans 7.0.1,Primefaces 3.2的Im。在用戶點擊瀏覽器後退按鈕(強制刷新HTTP請求)後強制執行ViewScoped Bean重新初始化

我的應用程序中有一些由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); 
} 

但我有一個問題,如下解釋:How to move user to timeout page when session expires, if user click on browser back button瀏覽器應改爲發送fullworthy新鮮的HTTP請求到服務器。

但在我的情況下,它沒有。我看到的是無處不在的網頁已過期頁面,這在我看來不是用戶友好的體驗。我想要的不是它從瀏覽器緩存加載,而是創建一個新的請求到服務器並顯示正確的頁面(不是網頁已過期頁面)。可能嗎。

請幫忙。非常感謝。

回答

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

Hi BalusC,謝謝你的回答。我實際上使用h:鏈接鏈接到第二頁。但它仍然是一個問題。 – frazkok 2012-07-19 00:51:36

+0

「網頁已過期」表示非緩存頁面已通過POST請求打開。 – BalusC 2012-07-19 01:39:01

+0

嗨BalusC它在Opera中工作,但不是在IE中。我使用MSIE 9.任何想法? IE不斷顯示可怕的網頁已過期頁面。 – frazkok 2012-07-19 02:18:27

相關問題