`

HTTP Cache机制学习(response meta标签)

 
阅读更多
HTTP Cache:response头部设置、http页面meta标签设置

response Http头部设置

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletA extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        //servlet页面默认是不缓存的
        //本页面允许在浏览器端或缓存服务器中缓存,时限为20秒。
        //20秒之内重新进入该页面的话不会进入该servlet的
        java.util.Date date = new java.util.Date();    
        response.setDateHeader("Last-Modified",date.getTime()); //Last-Modified:页面的最后生成时间 
        response.setDateHeader("Expires",date.getTime()+20000); //Expires:过时期限值 
        response.setHeader("Cache-Control", "public"); //Cache-Control来控制页面的缓存与否,public:浏览器和缓存服务器都可以缓存页面信息;
        response.setHeader("Pragma", "Pragma"); //Pragma:设置页面是否缓存,为Pragma则缓存,no-cache则不缓存

        //不允许浏览器端或缓存服务器缓存当前页面信息。
        /*response.setHeader( "Pragma", "no-cache" );   
        response.setDateHeader("Expires", 0);   
        response.addHeader( "Cache-Control", "no-cache" );//浏览器和缓存服务器都不应该缓存页面信息
        response.addHeader( "Cache-Control", "no-store" );//请求和响应的信息都不应该被存储在对方的磁盘系统中;    
        response.addHeader( "Cache-Control", "must-revalidate" );*///于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;

        System.out.println("进入了servlet");
        response.getWriter().write("欢迎光临我的主页");
    }

    
}


html页面中meta设置

meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。

http-equiv属性

1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;

又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http://yourlink;

3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion=6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。


当资源第一次被访问的时候,HTTP头部如下

(Request-Line)  GET /a.html HTTP/1.1
Host    127.0.0.1
User-Agent  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept              text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language     zh-cn,zh;q=0.5
Accept-Encoding     gzip,deflate
Accept-Charset      gb2312,utf-8;q=0.7,;q=0.7
Keep-Alive          300
Connection          keep-alive

HTTP返回头部如下

(Status-Line)       HTTP/1.1 200 OK
Date                Thu, 26 Nov 2009 13:50:54 GMT
Server              Apache/2.2.11 (Unix) PHP/5.2.9
Last-Modified       Thu, 26 Nov 2009 13:50:19 GMT
Etag                “8fb8b-14-4794674acdcc0″
Accept-Ranges       bytes
Content-Length      20
Keep-Alive          timeout=5, max=100
Connection          Keep-Alive
Content-Type        text/html

当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如

Last-Modified      // 指示最后修改的时间
Etag                // 指示资源的状态唯一标识
Expires             // 指示资源在浏览器缓存中的过期时间

接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息
当第二次请求该文件时,浏览器会先检查Cache目录下是否含有该文件,
如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息

If-Modified-Since   Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match       ”8fb8b-14-4794674acdcc0″

即把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信息。 如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下

(Status-Line)       HTTP/1.1 304 Not Modified
Date                Thu, 26 Nov 2009 14:09:07 GMT
Server              Apache/2.2.11 (Unix) PHP/5.2.9
Connection          Keep-Alive
Keep-Alive          timeout=5, max=100
Etag                “8fb8b-14-4794674acdcc0″

这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。 当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。
基本字段

Pragma
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。
Expires
文件在本地缓存的过期时间,如果浏览器发现缓存中的文件没有过期,则不发送请求(有例外,后面介绍)
Cache-Control
Cache -Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如 下:   
Public指示响应可被任何缓存区缓存。   
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请 求无效。
no-cache指示请求或响应消息不能缓存   
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。   
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。   
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。   
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应 消息。

Etag/If-None-Match
一对验证文件实体的标记 “Entity Tag”的响应/请求头 Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的
Last-Modified/If-Modified-Since
一对验证文件的修改时间的响应/请求头
Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。 前两个用来控制缓存的失效日期,浏览器可通过它来判定,需不需要发出HTTP请求; 后两个用来验证网页的有效性,服务器端利用它来验证这个文件是否需要重新返回
Last-Modified VS Etag
既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。
不同的情况
上面描述的是一个普通的浏览器缓存状态,在实际应用中,如页面跳转(点击页面链接跳转,window.open,在地址栏敲回车,刷新页面)等操作,会有一些区别
普通页面跳转
普通页面跳转包括链接点击跳转,用js脚本打开新页面(window.open) 无缓存情况下,请求会返回所有资源结果 设置Expires并且未过期时,浏览器将不会发出http请求 如果Expires过期,则会发送相应请求,并附带上Last-Modifed等信息,供服务器校验
页面刷新(F5)
这种情况一下,一般会看到很多304的请求,就是说即便资源设置了Expires且未过期,浏览器也会发送相应请求 IE和FF稍有区别 IE:

If-Modified-Since   Wed, 18 Nov 2009 15:54:52 GMT
If-None-Match   ”2360492659″
Pragma: no-cache    // 禁止缓存
FF:
If-Modified-Since   Wed, 18 Nov 2009 15:54:52 GMT
If-None-Match   ”2360492659″
Cache-Control   max-age=0   // 文件立即过期

强制刷新(Ctrl+F5)
效果和无缓存时候一致,返回200的结果




分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    如何防止IE缓存jsp文件

    1, 使用java提供的方法,在jsp或者servlet中都可以 &lt;&#37; response.setHeader(Pragma,No-cache); response.setHeader(Cache-Control,no-...META HTTP-EQUIV=Cache-Control CONTENT=no-cache&gt; &lt;META HTTP-

    简单的servlet增,删,改,查

    meta http-equiv="cache-control" content="no-cache"&gt; &lt;meta http-equiv="expires" content="0"&gt; &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt; &lt;meta ...

    JSP清除页面缓存常用方法小结

    response.setHeader(Cache-Control,no-cache); response.setDateHeader(Expires, 0); response.flushBuffer();%&gt; 在html页里: &lt;meta http-equiv=Content-Type content=text/html; charset=gb2312&gt; &lt;META...

    北大青鸟第二单元项目

    &lt;meta http-equiv="cache-control" content="no-cache"&gt; &lt;meta http-equiv="expires" content="0"&gt; frameset{width:960px;margin:0px auto;} * //UserBean ub = (UserBean)session.getAttribute(...

    jsp跳转的五种方式

    事实上现在的server都有cache机制,一般在8K(我是说 JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。  (2) ...

    asp.net 取消缓存相关问题说明

    meta http-equiv=”Cache-Control” CONTENT=”no-cache”&gt; &lt;meta http-equiv=”Pragma” CONTENT=”no-cache”&gt; &lt;/head&gt; (3)服务器具端取消: 服务器端: Response.Buffer = true; Response....

    验证码下载jsp

    &lt;meta http-equiv="cache-control" content="no-cache"&gt; &lt;meta http-equiv="expires" content="0"&gt; &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt; &lt;meta ...

    按IE后退按钮时让JSP不读缓存

    在ASP里我曾告诉过朋友如何让ASP程序不从缓存里读取数据,同样在JSP里也能实现,请看下面: 1, 使用java提供的方法,在jsp或者servlet...META HTTP-EQUIV=”Pragma” CONTENT=”no-cache”&gt; &lt;META HTTP-EQUIV

    简易聊天室

    meta http-equiv="cache-control" content="no-cache"&gt; &lt;meta http-equiv="expires" content="0"&gt; &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt; &lt;meta ...

    Asp.net禁用页面缓存的方法总结

    加入 代码如下: Response.Buffer = True Response.ExpiresAbsolute = Now() – 1 Response.Expires = 0 Response.CacheControl = “no-cache” Response.AddHeader “Pragma”, “No-Cache” 2、...

    JSP页面缓存cache技术–浏览器缓存介绍及实现方法

    表现层/数据服务层(传统web的表现层)也可以设置缓存(jsp cache 就是这一层,实现在app server上的缓存机制) 另外Browser也有缓存(如IE)这个大家也都知道(实现在 web server 上的缓存机制)。越上层的缓存...

    禁止页面缓存的几种方法分享

    今天在开发时碰到一种方法,...META HTTP-EQUIV=”Cache-Control” CONTENT=”no-cache”&gt; &lt;META HTTP-EQUIV=”Expires” CONTENT=”0″&gt; &lt;/HEAD&gt; asp教程做法 复制代码代码如下:Response.Buffer = True

    Wap技术初级教程、中级教程

    四、HTTP头与meta元素 一、HTTP 1.1的简要介绍 [TOP] HTTP 1.1是一个基于文本的互联网实体信息交互主流协议,这里的实体可以是WAP兼容浏览器之类的用户终端,可以是WAP网关之类的代理服务器,也可以是Java ...

    asp、html、js 禁止缓存的代码

    ASP Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response.Expires = 0 Response.CacheControl = no-cache Response.AddHeader ...meta http-equiv=Pragma CONTENT=no-cache&gt; &lt;meta http-

    如何将一个TXT文档里内容导入到文本框里

    Response.CacheControl = "no-cache" response.Charset="GB2312" '//数据返回的编码类型 显示中文数据必须 Dim objFSO Dim objText Dim ObjFile Dim strTextContent Dim objDrive '创建一个文件操作对象实例...

    AJAX防止页面缓存的代码

    用同样的url去获取数据的时候会发现是以前的数据~那样就给client端带来假象了~~ 采用以下的方法可以取消缓存 htm网页 &lt;metahttp equiv=”pragma”content&gt; &lt;metahttp equiv=”cache-control”content&gt; &lt;meta...

    手机浏览器 后退按钮强制刷新页面方法总结

    由于A界面的数据是通过ajax交互的,当你跳转到B界面,点击手机浏览器自带的...meta http-equiv=Cache-Control CONTENT=no-cache&gt; &lt;meta http-equiv=Pragma CONTENT=no-cache&gt; 注:(手机端)此方法行不通,

    dsltyyz-bundle

    common 公共模块cache 缓存config 缓存自动注入constant 常量定义包entity 实体包factory CompositePropertySourceFactory处理@PropertySource支持yaml文件handler 处理包properties 属性包response 通用响应包util ...

    Ajax中要注意的问题

     而firefox可以正常显示新的数据。... 使用java提供的方法设置http头信息,在jsp或者servlet中都可以 response.setHeader(“Pragma”,”No-cache”); response.setHeader(“Cache-Control”,”no-cache”); respon

    asp连接数据库代码实例

    response.write \"数据库连接出错,请检查conn.asp中的连接字符串。\" response.end end if function CloseDB Conn.Close set Conn=Nothing End Function %&gt; dim badword badword=\"\'|and|select|update|...

Global site tag (gtag.js) - Google Analytics