引言

  通过网络获取内容既缓慢,成本又高。大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本。因此,缓存和重用以前获取到的资源的能力成为性能优化的一个很关键的方面。

与缓存相关的HTTP首部字段主要有哪些

  (1)通用首部字段(意味着既能用于请求报文,又能用于响应报文)

字段名称 说明
Cache-Control 控制缓存的行为
Pragma http1.0的遗留物,值为"no-cache"时禁用缓存

  (2)请求首部字段

  (3)响应首部字段

  (4)实体首部字段

这些HTTP首部字段之间的联系和区别

  Pargram:设置no-cache禁用cache

  Expires:通过时间来控制来告诉浏览器资源缓存过期时间,如果还没过期就不发送请求。

HTTP缓存首部字段的优先级

  优先级:Pragram>Cache Control>Expires

HTTP缓存首部字段的特点和局限性

  上述的首部字段均能让客户端决定是否向服务器发送请求。为了让客户端与服务器之间更有效的利用缓存,HTTP1.1新增了几个首部字段来做这件事情。

  (1)Last-Modified

    服务器将资源传递给客户端时,会将资源最后更改的时间以"Last-Modified:GMT"的形式加载实体首部一起返回给客户端。    客户端会为资源标记上该信息,再进行下一次请求的时候,会将"Last-Modified:GMT"这个信息添加到请求中,服务器做检查,如果资源没有被修改过(这个地方自己体会),那么返回304状态码,如果资源修改过,就返回200状态码。

  (2)ETag

    为了解决"Last-Modified:GMT"可能存在不准确的问题,HTTP1.1还推出了ETag字段。服务器会通过某种算法,给资源加上一个唯一的标识符,把资源返回给客户端时,会在实体首部加上"ETag:标识符"一起返回给客户端,客户端会保留该资源的ETag字段。   当然,客户端再请求时,会将这个ETag带上,服务器只需比较一下ETag是否跟服务器上的一致(除非服务器上的资源发生了更新,否则服务器上该资源的ETag是不会变的)。

用户在不同的页面刷新行为的差别

  可以讲用户刷新访问界面的手段分为三类:

  (1)在浏览器地址栏输入地址

  (2)F5   、点击浏览器工具栏中的刷新按钮    、右键选择重新加载

  (3)Ctl+F5

  不同的手段网页加载速度是不一样的。他们之间的区别何在呢?假设,浏览器对一个地址没有进行任何的访问,更没有缓存文件。准备工作,地址栏输入网址,首次访问该网页,查看请求与响应信息可以看到请求头部没有任何关于http缓存相关的信息,响应的头部却包含了:

  Cache-Control:max-age=31104000

  Expires:Thu,20 Jul 2017 02:18:41  GMT

  Last-Modified:Fri,15 Jul 2016 04:11:51 GMT

这个时候,浏览器会对这些信息进行缓存,直至该文件过期、用户清空Cache或者用户强制资源刷新。

  准备工作完成后,就该比较三者间的区别:

  (1)输入地址   浏览器发现该资源已经缓存切没有过期(通过Cache-Control或者Expires头部),没有跟服务器确认,直接使用了了浏览器的缓存。

  (2)F5会让浏览器无论如何都发送一个HTTP请求给服务器,但是他的头部会加上浏览器缓存的Last-Modified,服务器判断后,发现没有过期,所以就返回了一个304状态码。这个信息很小,所以页面很快就刷新了。

  (3)Ctl+F5是彻底从服务器要一分资源过来。

实践中应该使用哪些报文头来控制缓存

  大多数首部字段还是有用的。

  虽然不是很懂,但是不明觉厉,实践者就会明白!

HTTP缓存控制总结的更多相关文章

  1. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  2. CDN网络(一)之典型的CND架构与HTTP协议的缓存控制

    前言 本人以前在CDN厂商蓝汛就职过一年时间,利用脑子里还残留的一些CDN知识,结合现有的书籍材料,写点东西. what's the CDN CDN(content delivery Network) ...

  3. PHP flush sleep 输出缓存控制详解

    1 2 3 4 5 6 ob_start,flush,ob_flush for($i=0;$i<</SPAN>10;$i++) { echo $i.''; flush(); slee ...

  4. 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cookie 读写; 自定义 HttpFilter; 其他

    [源码下载] 重新想象 Windows 8.1 Store Apps (90) - 通信的新特性: 通过 HttpBaseProtocolFilter 实现 http 请求的缓存控制,以及 cooki ...

  5. HTTP 缓存控制总结

    引言 通过网络获取内容既缓慢,成本又高:大的响应需要在客户端和服务器之间进行多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了访问者的数据成本.因此,缓存和重用以前获取的资源的能力成为 ...

  6. 基于maven插件的缓存控制插件

    asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...

  7. 005-优化web请求一-gzip压缩、http缓存控制和缓存校验[Pragma、Expires、Cache-Control、max-age、Last-Modified、用户刷新访问、避免过度304]

    优化Web应用的典型技术:缓存控制头信息.Gzip.应用缓存.ETag.反应型技术[异步方法调用和WebSocket] 一.模板缓存 spring.thymeleaf.cache=true sprin ...

  8. 跨域验证cookie与缓存控制

    1. 是否能跨域完全取决于浏览器控制,浏览器可以直接拒绝发送跨域请求(服务器根本收不到),也可以发送给服务器等接收到返回信息后决定是否让它被读取. 2. 服务器并不能辨别请求是从哪个源发过来的,只有在 ...

  9. 什么是Web缓存控制(基于HTTP头域)

    这是一篇转载的知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后 ...

  10. HTTP的缓存控制

    1.缓存的分类: (1)缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). (2)服务端缓存又分为 代理服务 ...

随机推荐

  1. 使用composer命令创建laravel项目命令详解

    composer命令创建laravel项目的命令是: composer create-project --prefer-dist laravel/laravel blog "5.2.*&qu ...

  2. Oracle自增长序列

    create table user_info ( id number(6) primary key, username varchar2(30) not null, password varchar2 ...

  3. hdu 5536 xor题

    input 1<=T<=1000 3<=n<=1000 s1 s2 ... sn 0<=si<=10e9 最多十个样例n>=100 output max((a ...

  4. CGRect相关工具函数

    NSStringFromCGRect(aCGRect): CGRectFromString(aString):如果把视图的框架以字符串的形式放在NSUserDefaults里面,那么该方法可以将其转回 ...

  5. IO流的操作规律

    输入流和输出流相对于内存设备而言. 将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出. 字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表.获取对应的文字.在 ...

  6. linux(视频学习)2

    第二部分(javaee的开发环境的搭建): 1. 安装jdk的过程: 安装ios的镜像文件,挂载到/mnt目录下.挂载: mount  /mnt/cdrom卸载: umount  /mnt/cdrom ...

  7. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3&nbsp

    项目使用的是tomcat7 ,浏览器是ie11 突然打开浏览器发现不能获取数据了 tomcat conf server.xml 文件 <Connector port="8080&quo ...

  8. elasticsearch的5种分片查询优先级

    elasticsearch可以使用preference参数来指定分片查询的优先级,使用时就是在请求url上加上preference参数,如:http://ip:host/index/_search?p ...

  9. android touchEvent事件学习

    学习网址:http://www.apkbus.com/forum.php?mod=viewthread&tid=44296 1:Android Touch事件传递机制解析 android系统中 ...

  10. C# 上传文件至远程服务器

    C# 上传文件至远程服务器(适用于桌面程序及web程序) 2009-12-30 19:21:28|  分类: C#|举报|字号 订阅     最近几天在玩桌面程序,在这里跟大家共享下如何将本地文件上传 ...