`
coding1688
  • 浏览: 231613 次
  • 来自: 上海
社区版块
存档分类
最新评论

HTTP协议中与浏览器缓存有关的部分

阅读更多

本文来自:http://www.vktone.com/articles/http_browser_cache.html   (原文可能会更新,请感兴趣的朋友直接访问)

1. 缓存协商

1.1)Last-Modified响应头 和 If-Modified-Since请求头

首次访问一个页面时,Web服务器可能会生成Last-Modified响应头,表示文件的最后修改时间。

请求头信息示例:

GET /articles/cpc18.html HTTP/1.1
Host: www.vktone.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://www.vktone.com/
Cookie: Hm_lvt_0349e3f0156bf70cd93447e10ddda4bb=1352731512700,1352967797808; Hm_lpvt_0349e3f0156bf70cd93447e10ddda4bb=1352967808911
Pragma: no-cache
Cache-Control: no-cache

响应头信息示例:

HTTP/1.1 200 OK Date: Thu, 15 Nov 2012 08:52:42 GMT Content-Length: 19737 Content-Type: text/html Content-Location: http://www.vktone.com/articles/cpc18.html Last-Modified: Thu, 15 Nov 2012 08:12:19 GMT Accept-Ranges: bytes Etag: "3e1eecee8c3cd1:3b78f" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET
这时浏览器便会缓存 Last-Modified 值,但再次访问的时候(强制刷新除外)就会发送 If-Modified-Since请求头
GET /articles/cpc18.html HTTP/1.1
Host: www.vktone.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: Hm_lvt_0349e3f0156bf70cd93447e10ddda4bb=1352731512700,1352967797808; Hm_lpvt_0349e3f0156bf70cd93447e10ddda4bb=1352969794340
If-Modified-Since: Thu, 15 Nov 2012 08:12:19 GMT
If-None-Match: "3e1eecee8c3cd1:3b78f"
如果请求的文件没有改变,则Web服务器返回304状态,浏览器将从缓存中得到文件内容
HTTP/1.1 304 Not Modified
Date: Thu, 15 Nov 2012 08:56:53 GMT
Content-Location: http://www.vktone.com/articles/cpc18.html
Last-Modified: Thu, 15 Nov 2012 08:12:19 GMT
Accept-Ranges: bytes
Etag: "3e1eecee8c3cd1:3b78f"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET

1.2)Etag响应头 和 If-None-Match请求头

Etag表明了文件的一种状态,当文件内容不变时,Etag也不变,反过来也是如此;如果文件内容变化时,Etag也应该发生变化。

Etag没有标准的生成方法,有的Web服务器采用“文件最后修改时间戳+文件长度”来作为Etag,有的可能以 md5摘要来作为Etag。

如果响应头中有 Etag,那么浏览器也会缓存起来。

再次访问该文件时,发出的请求会包含 If-None-Match请求头。

在前面的示例中其实已经有了Etag和If-None-Match的例子。

 

1.3)关于动态网页,比如 jsp/php/asp 等,不会自动生成 Last-Modified响应头,也不会自动生成 Etag响应头。

这个是程序员根据需要来实现的,如果动态内容不会经常变化,那就可以生成响应的 Last-Modified响应头 或者 Etag响应头。

 

2. 缓存截止期

2.1)Expires响应头

HTTP中,Expires响应头告诉浏览器该内容在何时过期,暗示浏览器在该内容过期之前不需要再询问服务器,而直接使用本地缓存即可。

 

Expires: Thu, 15 Nov 2012 09:12:19 GMT

 

要注意的是:Web服务器默认不会生成Expires响应头,即使是静态页面。不过,一般的Web服务器都可以进行配置,各种Web服务器的配置方式不尽相同。

另外,对于常见的静态文件格式,即使Web服务器返回的响应头中不包含Expires,浏览器也会默认一个过期时间。

比如,IE在某种缓存模式下,对于GIF文件设置为永不过期。

 

2.2)Cache-Control响应头

有一个问题,通过Expires指定的过期时间,是来自于Web服务器的系统时间,如果用户本地时间与服务器时间不一致,那么浏览器缓存的有效期检查就会受到影响。

幸运的是,在HTTP/1.1中有一个Cache-Control的响应头来弥补Expires的不足,形式如下:

Cache-Control: max-age=<second>

对于静态内容,Web服务器在开启Expires的同时,也会自动添加Cache-Control响应头。

那这样的话,Expires和Cache-Control都有的话,以哪个为准呢?

目前主流的浏览器都优先考虑 Cache-Control ,对于没有 Cache-Control 的,以 Expires 为准。

 

2.3)动态内容

需要程序员根据实际需要自行添加这几个响应头。

 

3. 在Java实现的Web Server中,动态内容添加处理缓存有关请求头和响应头

3.1)处理浏览器缓存的代码

下面的示意代码就展示了处理缓存的方式

    File f = new File(file);
    long lastModified = f.lastModified();    // 发现后面3位的毫秒数不为0
    
    long ifModifiedSince = request.getDateHeader("If-Modified-Since");    // 后面3位的毫秒数为0
    
    //response.setHeader("f1", Long.toString(lastModified));
    //response.setHeader("f2", Long.toString(ifModifiedSince));
    
    if (ifModifiedSince != -1) {
        // SC_NOT_MODIFIED 304
        if (lastModified / 1000L <= ifModifiedSince / 1000L) {
            response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
            response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);
            response.setHeader("Cache-Control","max-age="+3600);
            //System.out.println("\n\n\n\n\n cache "+System.currentTimeMillis()+"**************************** \n\n\n\n\n");
            return ;
        }
    }
    
    //System.out.println("\n\n\n\n\n whole "+System.currentTimeMillis()+"**************************** \n\n\n\n\n");
    
    // 要把修改时间设置上
    response.setContentLength((int) f.length());
    response.setDateHeader("Last-Modified", lastModified);
    response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);
    response.setHeader("Cache-Control","max-age="+3600);
    //out.print("");

3.2)如何测试?浏览器的三种刷新方式

使用 Firefox/FireBug, Chrome, HttpWatch 等工具跟踪 HTTP的请求和响应。

(1) 浏览器地址栏的“转到”或通过超链接跳转:如果已有缓存,会发送 If-Modified-Since 和 If-None-Match,并且 Expires 也有效;

(2) F5 一般刷新:会发送 If-Modified-Since 和 If-None-Match,但是 Expires 无效;

(3) Ctrl+F5 强制刷新:网页中所有内容(图片、js、css等)全部重新加载,不会发送 If-Modified-Since 和 If-None-Match。

本文来自:http://www.vktone.com/articles/http_browser_cache.html   (原文可能会更新,请感兴趣的朋友直接访问)

全文完。

6
2
分享到:
评论

相关推荐

    Web应用安全:HTTP协议POST方法.pptx

    POST 请求不会保留在浏览器历史记录中 POST 不能被收藏为书签 POST 请求对数据长度没有要求 POST方法 下图显示,某网页请求消息中摘取的一些重要内容。 请求行开头处的方法变成了 POST。与 GET 不同的是,空行下面所...

    HTTP 超详解 一文搞定HTTP面试知识

    4. HTTP缓存(浏览器缓存机制) 强缓存 协商缓存 5. 不同版本HTTP HTTP 0.9 HTTP 1.0 HTTP 1.1 HTTP 2.0 (一)HTTP原理 这部分学习并参考于:HTTP协议超级详解 超文本传输协议(英文:HyperText Transfer Protocol...

    Chrome低延迟播放RTSP方案—VLC网页播放浏览器小程序.pdf

    在遍地都是摄像头的今天,往往需要在各种B/S信息化系统中集成其视频流播放功能,海康、大华、华为等大厂摄像头遵循监控行业标准,普遍支持的是RTSP传输协议,而Chrome、Firefox、Edge等现代浏览器主流版本并不支持...

    操作系统安全:IIS简介.pptx

    HTTP和HTTPS协议监听器—HTTP.sys(HTTP协议栈),是Windows操作系统网格子系统的一部分,作为内核模式设备驱动实现的,其实是TCP之上的一个网络驱动程序。用来监听来自HTTP的请求,把请求传送给IIS处理,并将处理...

    TCPIP协议详解(4-1)

    IP和相关协议 第9章 IP协议家族 77 9.1 TCP/IP模型 77 9.1.1 解剖TCP/IP模型 78 9.1.2 协议组件 78 9.2 理解网际协议(IP) 79 9.2.1 IPv4结构 79 9.2.2 IP做什么 80 9.3 理解传输控制协议...

    Google Chrome 6.0.451.0 Dev 版(一个由Google公司开发的网页浏览器)

    与苹果公司的safari相抗衡,浏览速度在众多浏览器中走在前列,属于高端浏览器。采用BSD许可证授权并开放源代码,开源计划名为Chromium.本软件的代码是基于其他开放源代码软件所撰写,包括WebKit和Mozilla,目标是...

    总计近700页的超全面的前端面试题、笔试题大合集.rar

    HTML部分、CSS部分、JS部分、TS部分、REACT部分、VUE部分、性能优化部分、前端工程化部分、浏览器部分、布局、媒体、常用方法、渲染、网络协议、缓存、数据交互、异步处理、跨域处理、web安全防护、设计模式、操作...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    目前市场业务中在产品以及其他项目的认证和检测方面存在诸多不便,用户需要实地考察并频繁与检测单位沟通,填写繁琐的纸质检测报告、当面送递样品,对于检测环节中存在的问题难以及时交互并处理。市场上相应的检测...

    ProxyLab实验-计算机系统基础-gddrxy

    代理甚至可以通过将来自服务器的对象存储到本地来实现缓存,后续的请求可以直接从缓存中获取Web对象而不需要再次与远程服务器通信。 3) 3.1第一部分:实现顺序的Web代理程序 4) 第一步是实现一个处理HTTP/1.0 GET...

    java开源包3

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    移动WEB前端高级开发项目实战_搭建直播平台Cordova+Koa+React_编程案例实例课程教程.pdf

    原因有两个是 Webrtc只能被部分浏览器支持Webrtc提供了在web端发起视频会议的能力,本例选择了 Webrtc的部分协议能力来采集直搢发起方的视频,将转码和服务压力放在 Node.js服务器端,借以提供更稳定的服务。...

    项目8-局域网服务器的搭建.pptx

    TCP/IP应用层 HTTP和万维网 客户/服务器模型 网络服务器 相关知识 域名系统--DNS 其他应用层协议 项目8-局域网服务器的搭建全文共42页,当前为第3页。 TCP/IP应用层协议 TCP/IP应用层 域名系统(DNS) 超文本传输协议...

    TCP/IP技术大全(中文PDF非扫描版)

    几乎涵盖了有关TCP/IP的各个方面,包括开放式通信模型、TCP/IP通信模型、IP网络中的命名和寻址机制、地址解析及反向地址解析协议、DNS域字服务器、WINS、地址发现协议、IPv6、IP网络中的路由协议(RIP、OSPF等)、...

    BitComet V0.61 稳定版

    界面修正: 修正了部分界面中剪贴板快捷键失效的问题 核心改进: BT下载预览功能新增对wmv/asf格式文件的支持 核心改进: 新增播放wmv/rmvb格式的http/mms/rtsp流媒体功能 核心修正: 修正了因允许用户来源交换,可能...

    java开源包1

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    TCP-IP技术大全

    几乎涵盖了有关TCP/IP的各个方面,包括开放式通信模型、TCP/IP通信模型、IP网络中的命名和寻址机制、地址解析及反向地址解析协议、DNS域字服务器、WINS、地址发现协议、IPv6、IP网络中的路由协议(RIP、OSPF等)、...

    http-api-guide

    1.1:-低级消息解析和连接管理RFC 7231-HTTP / 1.1:-方法,状态代码和标头RFC 7232-HTTP / 1.1:-例如,If-Modified-Since RFC 7233-HTTP / 1.1:-获取部分内容RFC 7234-HTTP / 1.1:-浏览器和中介缓存RFC 723

    在浏览器输入URL回车之后发生了什么?(超详细版)

    这篇笔记是我这两天看了数十篇文章总结出来的,所以相对全面一点,但由于我是做前端的,所以会比较重点分析浏览器渲染页面那一部分,至于其他部分我会罗列出关键词,感兴趣的可以自行查阅, 注意:本文的步骤是建立...

    TCP/IP教程TCP/IP基础

    第三部分 IP和相关协议 第9章 IP协议家族 77 9.1 TCP/IP模型 77 9.1.1 解剖TCP/IP模型 78 9.1.2 协议组件 78 9.2 理解网际协议(IP) 79 9.2.1 IPv4结构 79 9.2.2 IP做什么 80 9.3 理解传输控制协议(TCP) 81 9.3.1 TCP...

    java开源包11

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

Global site tag (gtag.js) - Google Analytics