2.服务器端设置页面过期时间。客户端是如何判断什么时候过期并从新取数据
3.服务器(WEB服务器配置缓存策略)
一、服务器如何做到禁用缓存的。
代码实现:
1, 使用java提供的方法,在jsp或者servlet中都可以
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
2, 使用HTML标记,如下面:
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>
只有在使用安全连接时“Pragma: no-cache”才防止浏览器缓存页面。对于不受安全保护的页面,“Pragma: no-cache”
被视为与“Expires: -1”相同,此时浏览器仍旧缓存页面,但把页面标记为立即过期。
在IE 4或5中,“Cache-Control”META HTTP-EQUIV标记将被忽略,不起作用。
在实际应用中我们可以加上所有这些代码。然而,由于这种方法不能适用于所有的浏览器,所以是不推荐使用的。但
如果是在Intranet环境下,管理员可以控制用户使用哪种浏览器,我想还是有人会使用这种方法。
相关的语言整理如下:
禁止服务器端缓存:
Response.Expires = 0 或<meta http-equiv="Expires" CONTENT="0">
禁用客户端缓存。
HTML网页
<META HTTP-EQUIV="pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
ASP网页
<% Response.Expires = -1 Response.ExpiresAbsolute = Now() - 1 Response.cachecontrol = "no-cache" %>
PHP网页
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache");
JSP
response.setHeader("Pragma","No-Cache"); response.setHeader("Cache-Control","No-Cache"); response.setDateHeader("Expires", 0);
C#中禁止cache的方法!
Response.Buffer=true; Response.ExpiresAbsolute=System.DateTime.Now.AddSeconds(-1); Response.Expires=0; Response.CacheControl="no-cache";
二、如何配置IIS或Resin或Apache或nginx的缓存策略
IIS篇:
如果要禁用IIS所有站点静态页面缓存,那么可以:
编辑注册表中的 DisableStaticFileCache值,0为启用,1为禁用 ,该键值的位置位于:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\InetInfo\Parameters
如果没有该键值,新建一个dword值的就可以
我按照这样的方法配置了一下不过没有做测试!(如何测试ASP的缓存是否有呢?)
Resin篇
JSP应该会有。研究下看看
摘录的相关资料:
1、服务器缓存可以将动态页面加速到接近静态页面的速度。很多页面通过数据库请求生成,仅在每15分钟左右更新,比如CNN或Slashdot。Resin 可以将结果进行cache,并将它们做为静态页面处理,Resin的缓存对任何Sevrvlet有效,包括jsp和XTP页面,它依赖于http响应头。
默认情况下,页面是不缓存的,要进行cache,页面必须设置http cache头。
Resin的缓存操作类似代理cache,每个用户共享同样的cache页面
不缓存页面:
response.setHeader("Cache-Control", "no-cache, post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "Thu, 01 Dec 1994 16:00:00 GMT");
设定网页生存期:(服务器端设置好缓存过期时间)
<%
long now = System.currentTimeMillis();
response.setDateHeader("Expires", now + 15 * 60000);
%>
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
找了一下相关的资料不多。好像只能是修改RESIN的配置
<!-- 设置缓存页、静态也的延时值 -->
<cache-mapping url-pattern="/" expires="5s"/>
<cache-mapping url-pattern="*.gif" expires="60s"/>
<cache-mapping url-pattern="*.jpg" expires="60s"/>
<cache-mapping url-pattern="*.png" expires="60s"/>
如果是专业版可以:
<!-- 缓存启用 (专业版的功能) -->
<resin:if test="${isResinProfessional}">
<cache path="cache" memory-size="64M">
<!-- Vary header rewriting for IE -->
<rewrite-vary-as-private/>
</cache>
</resin:if>
下面的方法也能改变HTTPHEADER属性,它的原理和1是一样的.
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
StringnewLocn="/index.html";
response.setHeader("Location",newLocn);
%>
采用<JSP:FORWORD>该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.如下面的例子中(1)会输出index.html的内容,2不会输出index.html的内容,而是输出out.println("@@@@@@@@@@@@@@@@@");中的内容,并且在服务端会抛出:java.lang.IllegalStateException:Responsealreadycommitted异常,但客户端没有任何错误输出。