2010-11-26 95 views
1

我使用JSP(Spring MVC)向遠程用戶顯示信息。我在緩存頁面時遇到了一些問題。它看起來像這樣:頁面緩存問題

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>My Title</title> 
    </head> 
    <body> 
     <jsp:include page="menu.jsp" flush="true" /> 
     <form method="post"> 
      Write here 
      <input type="text" name="inputTxt" value="${txt}" /> 
      <input type="submit" value="OK" /> 
     </form> 

     <table border="1"> 
      ... 
     </table>      
    </body> 
</html> 

頁面應顯示一個項目表。當用戶按下確定按鈕時,服務器將信息添加到數據庫並向表中添加一行。一切正常。但表格顯示的信息取決於記錄的用戶。因此,當我第一次登錄時,我的應用程序效果很好(向我顯示與當前用戶對應的數據)。但是,當我從當前用戶註銷並從新登錄時,此頁面仍顯示第一位用戶的數據。如果我按F5,表格更新它的數據,並顯示正確的信息,它對應於當前用戶。我認爲緩存問題。 如何避免此問題?有任何想法嗎?

+0

您可以檢查這個計算器問題http://stackoverflow.com/questions/49547/making-sure-a-web-page-是 - 不緩存,跨所有的瀏覽器 – Javi 2010-11-26 22:29:11

回答

3

頁面確實可能被瀏覽器緩存。您可以使用Firebug在Firefox中進行驗證。通常,您希望禁用動態內容的客戶端緩存。您可以通過創建一個Filter來實現此目的,該Filter映射到的*.jsp並基本上執行doFilter()方法中的以下任務。

HttpServletResponse httpResponse = (HttpServletResponse) response; 
httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1 
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0 
httpResponse.setDateHeader("Expires", 0); // Proxies. 
chain.doFilter(request, response); 

這些響應標頭將指示客戶端(webbrowser)不緩存響應。測試前不要忘記清理瀏覽器緩存。

在Spring MVC,你可以像這樣創建一個攔截器:

public class DisableBrowserCachingInterceptor extends HandlerInterceptorAdapter { 

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { 
     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 
    } 
}