HTTP请求中浏览器缓存
2015-10-16 14:37
453 查看
本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制。客户端缓存是否需要是可以在服务端代码上控制的。那就是响应头。响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容;如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存。那么,HTTP请求中浏览器是如何缓存数据呢?
一、HTTP请求中浏览器缓存流程图
1、浏览器第一次请求
HTTP返回头部如下
当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如
接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息
2、当第二次请求该文件时
浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息
即把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信息。
如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下
这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。
当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。
三、浏览器缓存行为还有用户的行为有关!
from:http://www.studyofnet.com/news/391.html
一、HTTP请求中浏览器缓存流程图
1、浏览器第一次请求
(Request-Line) GET /a.html HTTP/1.1
Host 127.0.0.1
User-Agent Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset gb2312,utf-8;q=0.7,;q=0.7
Keep-Alive 300
Connection keep-alive
HTTP返回头部如下
(Status-Line) HTTP/1.1 200 OK
Date Thu, 26 Nov 2009 13:50:54 GMT
Server Apache/2.2.11 (Unix) PHP/5.2.9
Last-Modified Thu, 26 Nov 2009 13:50:19 GMT
Etag "8fb8b-14-4794674acdcc0"
Accept-Ranges bytes
Content-Length 20
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html
当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如
Last-Modified // 指示最后修改的时
Etag // 指示资源的状态唯一标识 Expires // 指示资源在浏览器缓存中的过期时间
接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息
2、当第二次请求该文件时
浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息
If-Modified-Since Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match "8fb8b-14-4794674acdcc0"
即把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信息。
如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下
(Status-Line) HTTP/1.1 304 Not Modified
Date Thu, 26 Nov 2009 14:09:07 GMT
Server Apache/2.2.11 (Unix) PHP/5.2.9
Connection Keep-Alive
Keep-Alive timeout=5, max=100
Etag "8fb8b-14-4794674acdcc0"
这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。
当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。
三、浏览器缓存行为还有用户的行为有关!
用户操作 | Expires/Cache-Control | Last-Modified/Etag |
地址栏回车 | 有效 | 有效 |
页面链接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5刷新 | 无效 | 无效 |
相关文章推荐
- 网络通信 --> select()用法
- Could not load type System.ServiceModel.Activation.HttpModule解决办法
- Android Studio中添加对HttpClient的支持包
- 安卓访问网络常用的3种方式(httpClient, httpUrlConnection,android-query ajax)及cookie处理
- 2G网络重选到3G
- CENTOS、Ubuntu网络配置
- 关于Viewpager加载网络图片显示不全
- iOS 安全:UIWebView访问Https站点防止中间人攻击
- Linux网络编程一步一步学 - 目录(汇总)zhuan
- HTTP POST GET 本质区别详解
- 安卓4.0以后主线程访问网络问题(NetworkOnMainThreadException)解决方法及子线程更新ui
- Http请求工具类 httputil
- 各类 HTTP 返回状态代码详解(转)
- UNIX网络编程:select,epoll,poll比较
- IOS网络笔记--ASIHTTP类库的使用(网络监测)
- C#获得网络中所有SQL Server服务器数据库名称
- java 网络编程之ServerSocket详解
- HTTP 错误 500.21 - Internal Server Error 解决方案
- 《TCP/IP 详解 卷一》读书笔记-----Ping&Traceroute
- iOS9 HTTP 不能正常使用的解决办法