HTTP协议 (四) 缓存

HTTP协议 (四) 缓存

阅读目录

  1. 缓存的概念
  2. 缓存的好处
  3. Fiddler可以方便地查看缓存的header
  4. 如何判断缓存新鲜度
  5. 通过最后修改时间,判断缓存新鲜度
  6. 与缓存相关的header
  7. ETag
  8. 浏览器不使用缓存
  9. 直接使用缓存,不去服务器端验证
  10. 如何设置IE不使用缓存
  11. 公有缓存和私有缓存的区别

 

缓存的概念

缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服务器端的缓存,有代理服务器的缓存, 有ASP.NET页面缓存,对象缓存。 数据库也有缓存, 等等。

http中具有缓存功能的是浏览器缓存,以及缓存代理服务器。

 

http缓存的是指:当Web请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是从原始服务器中提取这个文档。

缓存的好处

缓存的好处是显而易见的, 好处有,

1. 减少了冗余的数据传输,节省了网费。

2. 减少了服务器的负担, 大大提高了网站的性能

3. 加快了客户端加载网页的速度

 

Fiddler可以方便地查看缓存的header

Fiddler中把header都分门别类的放在一起,这样方便查看。

 

如何判断缓存新鲜度

Web服务器通过2种方式来判断浏览器缓存是否是最新的。

第一种, 浏览器把缓存文件的最后修改时间通过 header ”If-Modified-Since“来告诉Web服务器。

第二种, 浏览器把缓存文件的ETag, 通过header "If-None-Match", 来告诉Web服务器。

 

通过最后修改时间, 来判断缓存新鲜度

1. 浏览器客户端想请求一个文档,  首先检查本地缓存,发现存在这个文档的缓存,  获取缓存中文档的最后修改时间,通过: If-Modified-Since, 发送Request给Web服务器。

2. Web服务器收到Request,将服务器的文档修改时间(Last-Modified): 跟request header 中的,If-Modified-Since相比较, 如果时间是一样的, 说明缓存还是最新的, Web服务器将发送304 Not Modified给浏览器客户端, 告诉客户端直接使用缓存里的版本。如下图。

3. 假如该文档已经被更新了。Web服务器将发送该文档的最新版本给浏览器客户端, 如下图。

 

实例: 打开Fiddler, 然后打开博客园首页。然后F5刷新几次浏览器。 你会看到博客园首页也用了缓存。

 

与缓存有关的header

我们来看看每个header的具体含义。

Request

Cache-Control: max-age=0以秒为单位
If-Modified-Since: Mon, 19 Nov 2012 08:38:01 GMT缓存文件的最后修改时间。
If-None-Match: "0693f67a67cc1:0"缓存文件的Etag值
Cache-Control: no-cache不使用缓存
Pragma: no-cache不使用缓存
  

 

 

    

 

 

 

Response

Cache-Control: public响应被缓存,并且在多用户间共享,  (公有缓存和私有缓存的区别,请看另一节)
Cache-Control: private响应只能作为私有缓存,不能在用户之间共享
Cache-Control:no-cache提醒浏览器要从服务器提取文档进行验证
Cache-Control:no-store绝对禁止缓存(用于机密,敏感文件)
Cache-Control: max-age=6060秒之后缓存过期(相对时间)
Date: Mon, 19 Nov 2012 08:39:00 GMT当前response发送的时间
Expires: Mon, 19 Nov 2012 08:40:01 GMT缓存过期的时间(绝对时间)
Last-Modified: Mon, 19 Nov 2012 08:38:01 GMT服务器端文件的最后修改时间
ETag: "20b1add7ec1cd1:0"服务器端文件的Etag值

 

 

 

 

 

 

 

 

 

 

如果同时存在cache-control和Expires怎么办呢? 浏览器总是优先使用cache-control,如果没有cache-control才考虑Expires 

 

ETag

ETag是实体标签(Entity Tag)的缩写, 根据实体内容生成的一段hash字符串(类似于MD5或者SHA1之后的结果),可以标识资源的状态。 当资源发送改变时,ETag也随之发生变化。

ETag是Web服务端产生的,然后发给浏览器客户端。浏览器客户端是不用关心Etag是如何产生的。

为什么使用ETag呢? 主要是为了解决Last-Modified 无法解决的一些问题。

1. 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。

2. 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified只能精确到秒。

3. 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

 

实例, 打开Fiddler, 打开博客园首页。  你可以看到很多图片,或者CSS文件都是用了缓存。 这些都是通过比较ETag的值,来判断文件是否更新了。

 

浏览器不使用缓存

CTRL+F5强制刷新浏览器,或者设置IE。  可以让浏览器不使用缓存。

1. 浏览器发送Http request, 给Web 服务器, header中带有Cache-Control: no-cache.   明确告诉Web服务器,客户端不使用缓存。 

2. Web服务器将把最新的文档发送给浏览器客户端.

 

实例:

打开Fiddler, 打开博客园首页, 然后按CTRL+F5强制刷新浏览器,你将看到

Pragma: no-cache的作用和Cache-Control: no-cache一模一样。 都是不使用缓存。

Pragma: no-cache 是HTTP 1.0中定义的, 所以为了兼容HTTP 1.0. 所以会同时使用Pragma: no-cache和Cache-Control: no-cache

 

直接使用缓存,不去服务器验证

按F5刷新浏览器和在地址栏里输入网址然后回车。 这两个行为是不一样的。

按F5刷新浏览器, 浏览器会去Web服务器验证缓存。

如果是在地址栏输入网址然后回车,浏览器会"直接使用有效的缓存", 而不会发http request 去服务器验证缓存,这种情况叫做缓存命中,如下图

 

实例: 比较第一次访问博客园主页和第二次博客园主页

1. 启动Fiddler, 用firefox打开博客园主页, 发现有50多个session。

2. 按CTRL+X将Fiddler中的所有session删除。 关闭firefox,重新打开一个firefox,打开博客园主页。   发现只有30多个session.

分析;  少了的session是因为firefox直接用了缓存,而没有发http request。

 

 

如何设置IE不使用缓存

打开IE。点击工具栏上的, 工具->Internet选项->常规->浏览历史记录 设置. 选择“从不”。然后保存。

然后点击“删除”  把Internet临时文件都删掉 (IE缓存的文件就是Internet临时文件)。

 

公有缓存和私有缓存的区别

Cache-Control: public 指可以公有缓存, 可以是数千名用户共享的。

Cache-Control: private 指只支持私有缓存, 私有缓存是单个用户专用的。

转载自   http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html

转载于:https://www.cnblogs.com/dhl-2013/p/3252904.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZooKeeper启动过程2:FastLeaderElection

前一篇文章中说到,启动ZooKeeper集群时,需要分别启动集群中的各个节点,各节点以QuorumPeer的形式启动,最后到达startLeaderElection和lookForLeader。 先说startLeaderElection 首先,初始化节点自身的currentVote【当前…

遮罩效果 css3

CSS3提供了遮罩效果,这是以前CSS2中比较难实现的一个新特性,配合SVG或者canvas同样也可以实现遮罩效果,他的效果就如下图所示: 简单的说就是在一个层上面加一个过滤层,过滤层透明度越低,底层就显示的越多,反…

配置SQLServer,允许远程连接

需要别人远程你的数据库,首先需要的是在一个局域网内,或者连接的是同一个路由器,接下来就是具体步骤: (一)首先是要检查SQLServer数据库服务器中是否允许远程链接。其具体操作为: (1…

聚类算法初探(八)数据尺度化问题

文中尺度化的一些具体公式可参见 http://blog.csdn.net/itplus/article/details/10088101 其他相关链接 引言 预备知识 直接聚类法 K-means DBSCAN OPTICS 聚类分析的效果评测 作者: peghoty 出处: http://blog.csdn.net/itplus/article/details/10484553 欢迎转载/分享, 但请…

【待完善】make: command not found,以及libtool.m4 and ltmain.sh have a version mismatch问题的解决方案...

之前为了使用一个库,都是去下载源码,然后根据开发者提供的README手动用GCC编译,一直不能使用Makefile感觉很蛋痛,比如最近使用的ZThread 还是怪自己以前过于依赖IDE 最近发现用Cygwin就可以使用诸如./configure, make这样的命令&a…

菜鸟nginx源码剖析

菜鸟nginx源码剖析 配置与部署篇(一) 手把手配置nginx “I love you” TCMalloc 对MYSQL 性能 优化的分析 菜鸟nginx源码剖析系列文章解读 Author:Echo Chen(陈斌) Email:chenb19870707gmail.com Blog&…

微信公众平台开发(59)相册

微信公众平台开发 微信公众平台开发模式 企业微信公众平台 万能相册 3G相册作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/weixin-59-albums.html 相册(Photo album)又称影集或照片集,是用来装放相片的物品。相册主要用来收藏和保…

hadoop学习笔记:zookeeper学习(上)

在前面的文章里我多次提到zookeeper对于分布式系统开发的重要性,因此对zookeeper的学习是非常必要的。本篇博文主要是讲解zookeeper的安装和zookeeper的一些基本的应用,同时我还会教大家如何安装伪分布式,伪分布式不能在windows下实现&#x…

160 - 21 Cabeca

环境: Windows xp sp3 工具: exeinfope ollydbg 查壳: 拿到程序后查壳,发现程序无壳,为Delphi写的。 程序长成这个样 输入: Name:GNUBD Serial:1234567 Serial:76543…

160 - 22 CarLitoZ.1

环境 Windows xp sp3 工具 exeinfope Ollydbg 查壳 无壳的VB程序 测试 输入“1234567” 显示这个: 直接OD载入字符串搜索。 00402D20 > \55 push ebp 00402D21 . 8BEC mov ebp,esp 00402D23 . 83EC 0C sub e…

实战MEF(4):搜索范围

在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某…

Android应用程序请求SurfaceFlinger服务创建Surface的过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7884628 前面我们已经学习过Android应用程序与SurfaceFlinger服务的连接过程了。连接上SurfaceFlinger服务之后,Android应用程序就可以请求…

160 - 23 Chafe.1

环境 Windows xp sp3 工具 exeinfope ollydbg 查壳 用exeinfoe查壳 测试 可以从左下角状态栏看出serial是无效的 直接OD载入字符串搜索 00401274 |. /75 17 jnz XChafe_1.0040128D 00401276 |. |6A 00 push 0x0 ; /Ti…

160 - 24 Chafe.2

环境: Windows xp sp3 工具 exeinfope OllyDBG 查壳 用exeinfope查壳,发现是没有壳的。 测试 可以看出是从红色框框里面的内容判断serial是否有效 OD载入,字符串搜索可以得到: 004011EC . 55 pus…

十个利用矩阵乘法解决的经典题目

转载自 Matrix67: The Aha Moments 好像目前还没有这方面题目的总结。这几天连续看到四个问这类题目的人,今天在这里简单写一下。这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质。 不要以为数学中的矩阵也是黑色屏幕上不断变化的绿色…

160 - 25 CodeZero.1

环境 Windows xp sp3 工具 exeinfope OllyDBG 查壳 无壳的VB程序 测试 运行程序后出现Nag窗口,所以这次的目标是除Nag窗口和找到serial 程序运行后弹出Nag窗口,并且等待5秒后按钮的标题改成“Continue..”,点击后才会弹出输入seria…

WP8开发学习笔记动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)...

很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录, 如果未登录则跳转到LoginPage.xaml否则跳转到MainPage界面。 这时候就要分析程序的启动和导航的过程。 程序的启动是App.xamlcs负责的。 App类的构造器…

6.数组和Hash表

当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组。 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-is操作符来判断是否是个数组&#xff0…

160 - 26 Colormaster

环境 Windows xp sp3 查壳 无壳的VB程序 测试: 输入 Name:123456 Serial:12345 字符串搜索,找到判断位置。 判断Name的长度要大于等于5: 00402CBC . 33C9 xor ecx,ecx 00402CBE . 83F8 04 cmp eax,0x4 00…

Android 菜单(OptionMenu)大全 建立你自己的菜单

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)&#…