如何在JSP页面中控制缓存?

The*_*mer 5 jsp caching servlets servlet-filters

我在doFilter中使用以下代码创建了一个Servlet过滤器:

HttpServletResponse httpResponse = (HttpServletResponse)response;

httpResponse.setHeader("Cache-Control","no-cache");
httpResponse.setHeader("Pragma","no-cache");
httpResponse.setDateHeader("Expires", 0); 

chain.doFilter(request, response);
Run Code Online (Sandbox Code Playgroud)

我想确保在客户端没有任何缓存,并且每个请求(甚至是浏览器后退按钮中的那个)都被定向到服务器.

但是,即使在实现上述过滤器之后,也会缓存某些页面(使用浏览器的后退按钮可访问).

和其他未缓存的页面在Internet Explorer中显示Web Page Expired错误.

Bal*_*usC 10

首先,完整的集合是:

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.
Run Code Online (Sandbox Code Playgroud)

no-storemust-revalidate需要得到它的工作在每个下的Firefox.

但是,即使在实现上述过滤器之后,也会缓存某些页面(使用浏览器的后退按钮可访问).

你是怎么测试的?这些标题实际上会阻止浏览器从浏览器缓存中而不是直接从服务器请求页面.最好的测试是有一个Filter监听/*并添加调试语句的风格:

HttpServletRequest httpRequest = (HttpServletRequest) request;
String method = httpRequest.getMethod();
String URI = httpRequest.getRequestURI();
System.out.println(method + " request invoked on " + URI);
Run Code Online (Sandbox Code Playgroud)

这应该打印实际的请求.

还要确保不使用HTML <meta>标记覆盖JSP页面本身的标头.

和其他未缓存的页面在Internet Explorer中显示Web Page Expired错误.

如果非缓存请求是POST请求而非请求,则只能获取此信息GET.该GET请求将简单地从服务器再次,而不是从浏览器缓存请求.