3

我尝试了很多可能的解决方案,但我无法解决问题:

<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache-control" content="no-store">
<meta http-equiv="Cache-control" content="must-revalidate">
<meta http-equiv="pragma" content="no-cache"> 
<meta name="expires" content="0">

这些都不起作用。有人可以帮忙吗?我正在使用 jsp/servlet。应用程序是 websphere 门户 6.1 的一个 portlet。

4

5 回答 5

2

永远不要依赖 HTML 页面中的元标记来控制缓存。相反,您需要在响应中设置 HTTP 标头。在您的控制器中显示任何输出之前,您需要设置以下内容:

response.setHeader("Cache-Control", "max-age=0, must-revalidate");

这在过去对我有用,但如果这不起作用,您可能还想尝试以下方法

response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 1);
于 2011-06-24T12:06:38.073 回答
1

仅当从本地磁盘文件系统而不是通过 HTTP 请求页面时,才使用元标头。您需要设置真正的HTTP 响应标头。

创建一个过滤器,它基本上完成以下工作:

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse hsr = (HttpServletResponse) res;
    hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    hsr.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(req, res);
}

例如*.jsp,将它映射到一个 URL 模式以使其在所有 JSP 页面上运行。

Cache-Control在原始问题中的标题是正确的,必须拥有no-storeand must-revalidatealong no-cache。迄今为止发布的几乎所有其他答案基本上都是针对 MSIE 的。

也可以看看:

于 2011-06-24T20:32:51.317 回答
0

尝试在您的 servlet 的响应标头中设置它们,例如,

response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
于 2011-06-24T12:03:16.960 回答
0

Firefox 3 以其缓存问题而闻名

https://bugzilla.mozilla.org/buglist.cgi?quicksearch=Cache-control

我曾经实现了一个解决方案,其中每个页面都会在其名称中添加一个随机 ID,因此 Firefox 认为这是一个不同的页面。对portlet 不太了解,但是您尝试过吗?

于 2011-06-24T12:03:20.173 回答
0

Liferay Portal Server 也有类似的问题。我们的解决方案是在资源链接(css/js)中添加时间戳,例如

/mysite/css/menu.css?t=1291218768531

我们控制何时从应用程序中刷新时间戳,因此我们可以控制何时强制浏览器重新加载资源。

于 2011-06-24T12:15:12.807 回答