2010-11-26 91 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 
    } 
}