分享

JSP缓存的三个问题分析

 风中的眼睛_ 2013-04-28

JSP缓存的三个问题分析

时间:2009-12-22 点击:1086

  核心提示:判断什么时候过期并从新取数据3.服务器(WEB服务器配置缓存策略)一、服务器如何做到禁用缓存的。代码实现:1, 使用java提供的方法,在jsp或者servlet中都可以 % response.setHeader('Pragma','No-cache'); response.setHeader('C...
1.服务器端禁用缓存。那客户端不论如何都不能缓存网页
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);
%>

不缓存页面2:
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异常,但客户端没有任何错误输出。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多