引言

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

与缓存相关的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. [code]最长回文子串

    分析: 不能用scanf("%s"),因为碰到空格或者Tab就会停下来. 解决输入中有空格 方法一:使用fgetc(fin),读取一个打开的文件fin,读取一个字符,然后返回一个i ...

  2. 删除sql计划 调用的目标发生了异常。 (mscorlib) 其他信息: 用户 'sa' 登录失败。

    在删除以前创建的sql的计划任务时,弹出如题错误提示,发现错误原因在于,sa密码更改过,导致在删除时因为sa的密码和当前的密码不正确出现此错误. 解决办法: 1.在计划任务的编辑窗口,找到管理连接 2 ...

  3. 微信支付WxpayAPI_php_v3(二)支付功能开发

    这里我没有开发openid和acessToken的获取,需要的请参考文档获取. 在阅读本教程之前请熟读微信支付的开发者文档. 直接开始[统一下单],在实际开发的项目中一般都有mvc分层的开发思想. 根 ...

  4. oracle中触发器的讲解

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...

  5. TexturePacker license Key免费获取方式

    TexturePacker是一款功能非常强大的图片制作工具.是一款付费软件,但是TexturePacker的作者Andreas Löw先生也给出获得免费key 的方法...大家可以到这个网站去申请 h ...

  6. java transient修饰符

    1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2)transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被trans ...

  7. 织梦DEDE文章列表前面自动加递增数字标签

    实现的办法很简单,只须要在序号递增的处所加上这段代码就行 [field:global runphp=""yes"" name=autoindex][/field ...

  8. win32使用ATL显示C#COM窗体

    显示效果如图: 环境:win7 64.VS2013 代码如下: #include <atlbase.h> #include <atlhost.h> // 导入 #import ...

  9. jsp base标签与meta标签学习小结

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  10. 多线程进阶之并发工具类:CountDownLatch、CyclicBarrier

    并发工具类在java.util.concurrent包下.常用的有CountDownLatch.CyclicBarrier,用它们可以控制并发流程. 1.CountDownLatch探究: 主要用到其 ...