我在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);
我想确保在客户端没有任何缓存,并且每个请求(甚至是浏览器后退按钮中的那个)都被定向到服务器。
但是,即使在实现上述过滤器之后,也会缓存一些页面(使用浏览器的后退按钮进行访问)。
其他未缓存的网页在Internet Explorer中显示网页已过期错误。
答案 0 :(得分: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.
需要no-store
和must-revalidate
才能让它在每个Firefox下运行。
但是,即使在实现上述过滤器之后,一些页面也会被缓存(可以使用浏览器的后退按钮访问)。
你是如何测试的?这些标题实际上会阻止浏览器从浏览器缓存中而不是直接从服务器请求页面。最好的测试是让Filter
监听/*
并添加调试语句:
HttpServletRequest httpRequest = (HttpServletRequest) request;
String method = httpRequest.getMethod();
String URI = httpRequest.getRequestURI();
System.out.println(method + " request invoked on " + URI);
这应该打印实际的请求。
另外,请确保不要使用HTML <meta>
标记覆盖JSP页面本身的标题。
和其他未缓存的网页在Internet Explorer中显示网页已过期错误。
如果非缓存请求是POST
请求,而不是GET
请求,则只能获取此信息。只需再次从服务器请求GET
请求,而不是从浏览器缓存中请求。{/ p>
答案 1 :(得分:3)
我在oracle文档中发现了这一点,他们提到你不应该使用
httpResponse.setDateHeader("Expires", 0);
代替它,你应该使用
setDateHeader("Last-Modified", (new Date()).getTime() );
答案 2 :(得分:0)
我们还使用Last-Modified标头来鼓励浏览器始终获得新版本。
setDateHeader("Last-Modified", (new Date()).getTime() ); // Set last modified to right now.
我不确定是否保持浏览器的后退按钮不使用缓存。您对标题字段执行的任何操作仅在首次加载页面时进行评估,即IIRC。
答案 3 :(得分:0)
我找到了这样的信息:http://docs.oracle.com/cd/E19501-01/819-3659/beagw/index.html(参见缓存标记)