引言

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

与缓存相关的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. c# office转换成pdf

    下载地址 [url]http://www.microsoft.com/downloads/details.aspx?FamilyId=4D951911-3E7E-4AE6-B059-A2E79ED87 ...

  2. css 相关

    background-size: auto就会变成就是不会让图像变形的,会自动调整,一般是会设置多少箱像素的, background-size: XXpx XXpx;百分百那就铺满整个区域了 back ...

  3. CSS中!important的使用 转

    本篇文章使用最新的IE10以及firefox与chrome测试(截止2013年5月27日22::) CSS的原理: 我们知道,CSS写在不同的地方有不同的优先级, .css文件中的定义 < 元素 ...

  4. springmvc 关于controller的字符编码

    在使用springMVC框架构建web应用,客户端常会请求字符串.整型.json等格式的数据,通常使用@ResponseBody注解使 controller回应相应的数据而不是去渲染某个页面.如果请求 ...

  5. Guess the Array

    Guess the Array time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  6. POJ 2368 巴什博奕

    题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜.求使后手必定获胜的L的最小值(L>=2). 题目思路: 巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少 ...

  7. PullToRefreshListView上拉加载、下拉刷新 eclipse项目

    说明:此项目实在fragment中的,需要依赖library完成,还用到了Xuitls.jar包.使用了Pull解析XML eclipse中的项目: //注意:此刷新功能是使用的第三方的PullToR ...

  8. windows程序设计学习笔记(一)

    windows里的变量类型 1.简单重定义windows变量 BOOL (TRUE FALSE) INT UINT(32位,4字节) LONG DWORD(32位,4字节) lParam,wParam ...

  9. activemq学习

    一.特性及优势 1.实现JMS1.1规范,支持J2EE1.4以上2.可运行于任何jvm和大部分web容器(ActiveMQ works great in any JVM)3.支持多种语言客户端(jav ...

  10. 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript

    原文:http://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/ Build Your o ...