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

Posted

技术标签:

【中文标题】如何控制 JSP 页面中的缓存?【英文标题】:How to control cache in JSP page? 【发布时间】:2010-12-29 12:48:26 【问题描述】:

我在 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 中显示 Web Page Expired 错误。

【问题讨论】:

【参考方案1】:

我们还使用 Last-Modified 标头来鼓励浏览器始终获取新版本。

setDateHeader("Last-Modified", (new Date()).getTime() ); // Set last modified to right now.

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

【讨论】:

【参考方案2】:

首先,完整的集合是:

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-storemust-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 中显示 Web Page Expired 错误。

只有当非缓存请求是 POST 请求而不是 GET 请求时,您才能获得此信息。 GET 请求将简单地再次从服务器而不是从浏览器缓存中请求。

【讨论】:

【参考方案3】:

我找到了这个信息:http://docs.oracle.com/cd/E19501-01/819-3659/beagw/index.html(参见缓存标签

【讨论】:

【参考方案4】:

我在 oracle 文档中发现了这一点,他们提到你不应该使用

httpResponse.setDateHeader("Expires", 0);

你应该使用它来代替它

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

http://docs.oracle.com/cd/E13158_01/alui/wci/docs103/devguide/tsk_pagelets_settingcaching_httpexpires.html

【讨论】:

以上是关于如何控制 JSP 页面中的缓存?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户“返回”但在 JSP 中注销后保留缓存?

java 中如何进行页面缓存

Spring Boot 如何控制 Tomcat 缓存?

如何在 JSP 页面中从 Java 类中设置 hashmap 的值以便在控制器中进一步使用

如何利用EasyUI框架控制页面布局

Spring MVC 控制器如何绑定到 JSP 页面?