本文导读:浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制。客户端缓存是否需要是可以在服务端代码上控制的。那就是响应头。响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容;如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存。那么,HTTP请求中浏览器是如何缓存数据呢?

一、HTTP请求中浏览器缓存流程图

1、浏览器第一次请求

2、浏览器再次请求时

二、HTTP请求中浏览器缓存流程的文字描述

1、当资源第一次被访问的时候,HTTP头部如下

(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刷新

无效

无效

from:http://www.studyofnet.com/news/391.html

最新文章

  1. Node实践之一
  2. Hive 中parse_url的使用
  3. Ubuntu如何以root身份登陆-(基于14.04版本)
  4. Java Development Kit(JDK) 8 新特性(简述)
  5. CSS也可以改变图片幅面尺寸
  6. Excel教程(2) - 函数的参数
  7. POJ 2506 Tiling
  8. Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind
  9. 学习Git过程中常用命令的总结
  10. day17
  11. 如何更有效地说服开发接收你的bug?!
  12. unigui 1.90.0 Example
  13. node.js 框架express关于报错页面的配置
  14. 【CF542D】Superhero's Job 暴力
  15. 遍历文件,读取.wxss文件,在头部添加一条注释
  16. 11--Python入门--面向对象
  17. EventFlow.helper.js 事件流程控制
  18. Visual Studio 2012创建SQL Server Database Project提示失败解决方法
  19. 让apache支持htaccess文件
  20. Python之旅:列表

热门文章

  1. facebook代码发布
  2. HDU 1385 Minimum Transport Cost (最短路,并输出路径)
  3. POJ 1330 Nearest Common Ancestors(求最近的公共祖先)
  4. 简单易懂的现代魔法——Play Framework攻略1
  5. 关于DotNetBar中DataGridViewX 自动全屏 Anchor属性无效问题
  6. C# Regex类用法
  7. DP:斐波纳契数
  8. C 语言学习guideline
  9. 用Eclipse编写运行Java程序
  10. 模拟在table中移动鼠标,高亮显示鼠标所在行