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

如何在JSP页面中控制缓存?,jsp,caching,servlets,servlet-filters,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.do

我在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中显示网页过期错误。

我们还使用上次修改的标题鼓励浏览器始终获取新版本


setDateHeader(“上次修改”,“新日期()).getTime());//将“上次修改”设置为“立即”。


不过,我不确定是否要阻止浏览器的后退按钮使用缓存。您对标题字段所做的任何操作都只会在首次加载页面时进行评估,IIRC。

首先,完整的集合是:

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
必须重新验证
才能在每个Firefox下使用

但是,即使在实现了上述过滤器之后,也会缓存一些页面(可以使用浏览器的“后退”按钮进行访问)

你是怎么测试的?这些标题实际上会阻止浏览器从浏览器缓存而不是直接从服务器请求页面。最好的测试是使用一个
过滤器
来监听
/*
,并添加一个调试语句:

HttpServletRequest httpRequest = (HttpServletRequest) request;
String method = httpRequest.getMethod();
String URI = httpRequest.getRequestURI();
System.out.println(method + " request invoked on " + URI);
这将打印实际请求

还要确保不要使用HTML
标记覆盖JSP页面本身中的标题

和其他未缓存的页面,在Internet Explorer中显示网页过期错误


只有当未缓存的请求是
POST
请求,而不是
get
请求时,才能获取此信息。
GET
请求只需再次从服务器而不是浏览器缓存中请求即可。

我发现了此信息:(请参见缓存标签)

我在oracle文档中发现了此信息,其中提到您永远不应该使用

httpResponse.setDateHeader("Expires", 0);
你应该用它来代替它

setDateHeader("Last-Modified", (new Date()).getTime() );