HTTP Caching 用好了,可以极大的减小服务器负载和减少网络带宽。十分有必要深入了解下 http 的 caching 协议。

  先来看下请求/响应过程:

http 请求/响应

  1、用 Last-Modified 头

  在第一次请求的响应头返回 Last-Modified 内容,时间格式如:Wed, 22 Jul 2009 07:08:07 GMT。是零时区的 GMT 时间,servlet 中可以用 response.addDateHeader ("Last-Modified", date.getTime ()); 加入响应头。如图:

last-modified 和 If-Modified-Since

  Last-Modified 与 If-Modified-Since 对应的,前者是响应头,后者是请求头。服务器要处理 If-Modified-Since 请求头与 Last-Modified 对比看是否有更新,如果没有更新就返回 304 响应,否则按正常请求处理。如果要在动态内容中使用它们,那就要程序来处理了。

  ps:servlet 取 If-Modified-Since 可以用 long last = requst.getDateHeader ("If-Modified-Since");

  2、用 Etag 头

  很多时间可能不能用时间来确定内容是否有更新。那可以用 Etag 头,etag 是以内容计算一个标识。计算的方式可以自己决定,比如可以用 crc32、md5等。

Etag 和 If-None-Match

  Etag 与 If-None-Match 是对应的,前者是响应头,后者是请求头。服务器要判断请求内容计算得到的 etag 是否与请求头 If-None-Match 是否一致,如果一致就表示没有更新,返回 304 就可,否则按正常请求处理。可以参考:用 HttpServletResponseWrapper 实现 Etag 过滤器

  3、用 Expires 头,过期时间

  当请求的内容有 Expires 头的时候,浏览器会在这个时间内不去下载这个请求的内容(这个行为对 F5 或 Ctrl+F2 无效,用 IE7,Firefox 3.5 试了,有效的比如:在地址输入后回车)。

expires 过期时间

  在 servlet 中可以用 response.addDateHeader ("Expires", date.getTime ()); 添加过期内容。

  ps:在 httpwatch 中可以看到 Result 为 (Cached) 状态的。

  4、用 max-age 的 Cache-Control 头

  max-age 的值表示,多少秒后失效,在失效之前,浏览器不会去下载请求的内容(当然,这个行为对 F5 或 Ctrl+F2 无效)。比如:服务器写 max-age 响应:response.addHeader ("Cache-Control", "max-age=10");

  ps:如果你还要加一些 Cache-Control 的内容,比如:private,最好不要写两个 addHeader,而是一个 response.addHeader ("Cache-Control", "private, max-age=10"); 否则 ie 可能对 max-age 无效,原因它只读第一个 Cache-Control 头。

  小结:

  Last-Modified 与 Etag 头(即是方式 1 和2)还是要请求服务器的,只是仅返回 304  头,不返回内容。所以浏览怎么 F5 ,304 都是有效的。但用 Ctrl+F5 是全新请求的(这是浏览器行为,不发送缓存相关的头)。

  Expires 头与 max-age 缓存是不需要请求服务器的,直接从本地缓存中取。但 F5 会忽视缓存(所以使用 httpwatch 之类的 http 协议监察工具时,不要 F5 误认为 Expires 和 max-age 是无效的)。

  http 协议监察工具:

  Firebox:httpfox、live http header

  IE:httpwatch、iehttpheader

转载于:https://www.cnblogs.com/coolmanlee/archive/2012/12/06/2805030.html

Last-Modify、ETag、Expires和Cache-Control(转载)相关推荐

  1. Http协议head和cache control使用分类小结

    1 Request: method: GET, HEAD, POST.(...) Get --- Retrive Data. Head --- The HEAD method is identical ...

  2. cache-control_网站 cache control 最佳实践

    有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 cache control 缓存控制策略定义不正确,导致服务端最新部署之后客户端没有接收到最新的更改. 本文将向您展示正确的缓存设置 ...

  3. 【Manual】Memory Cache Control

    [Intel-64 and IA-32 Architectures Software Developer's Manual]Chapter 11 本章节关于 memory cache.cache co ...

  4. C#实现进度条progress control(转载)

    本文转载至http://www.cnblogs.com/Bird/archive/2007/03/14/675222.html An animated progressbar control with ...

  5. html cache control 设置,关于 浏览器 Cache-Control 不能设置问题。

    首先,缓存问题依靠html的meta标签解决是不靠谱的,一般大型网站都依靠nginx server在 http头中对静态资源设置缓存. 而影响缓存的http头有好几个,尽管http 1.1协议之后,从 ...

  6. HTTP 头部字段 Cache Control max-age = 0 和 no-cache 的区别

    禁掉缓存的情况:请求百度首页 开启缓存的情况下: 似乎没有什么变化. 再观察请求的头部字段:cache-control: max-age=0 标头 Cache-Control: max-age=0 暗 ...

  7. java expires_设置浏览器禁止 缓存 的三个头 : expires,pragma, cache-

    [java]代码库package am_cn.itcast.response; import java.io.IOException; import java.util.Date; import ja ...

  8. cache control 里 no-cache 和 no-store 的区别

    no-cache 并不意味着不缓存. 事实上,这意味着在对每个请求使用您可能拥有的任何缓存响应之前"使用服务器重新验证". 另一方面,must-revalidate 只需要在资源被 ...

  9. Symfony2学习笔记之HTTP Cache

    富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来 说,这没什么. Symfony2非常的轻快,无论你做些严重超载的 ...

  10. 提高 Web 站点性能的最佳实践

    原文地址:http://developer.yahoo.com/performance/rules.html 本文在尊重原文基础上,尽量翻译得通俗易懂一些. 本文内容 提高 Web 站点性能的最佳实践 ...

最新文章

  1. Centos7 安装 nginx 服务器的两种方式
  2. IOS项目之分层MVVM
  3. C++学习之路 | PTA乙级—— 1063 计算谱半径 (20 分)(精简)
  4. 使用Windows 自带防火墙拦截勒索病毒
  5. Linux客户端权限,linux用户与权限使用方法
  6. python时间控件遮罩层_jquery遮罩层插件
  7. linux安装opencv让输入密码,linux下安装opencv的全过程(对初学者或者linux不熟悉的童鞋,非常适合)...
  8. java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些
  9. Android使adb作为host运行在arm64平台
  10. gSoap下Server端接口函数的数据传出
  11. 微信小程序时间轴demo_微信小程序 - 时间轴(组件)
  12. 红帽linux系统解压,linux redhat 红帽 centos 压缩 解压缩
  13. 联想a30微型计算机,联想A30测评,硬件部分。是电脑哦。
  14. coap 返回版本信息_CoAP协议浅析
  15. 微信小程序新版头像昵称API [保存用户头像到服务器]
  16. 高德,微信公众号,企业微信获取定位
  17. linux连接wifi的方法
  18. SqlServer中的dbo是什么意思?
  19. halcon之测量和拟合
  20. 本地项目与Git项目关联

热门文章

  1. LuaForUnity9:uLua的一个简单实例
  2. 51nod-1337:翻转游戏
  3. matlab2c使用c++实现matlab函数系列教程-histc函数
  4. c#连接mysql数据库,增删查改命令执行
  5. zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤三配置SDK)
  6. quartus仿真27:JK触发器构成的同步二进制加法计数器(分析)
  7. 贺利坚老师汇编课程40笔记:指令里的数据在哪里有多长
  8. C语言学习记录_2019.02.10
  9. 51Nod 1067:Bash游戏 V2(巴什博弈)
  10. usb 视频设备 按钮消息处理 和普通usb连接的事件处理