协商缓存与状态码304
304

有时候我们访问某些网站会发现在控制台中,网络状态码返回的是304。(更多状态码相关-http必备知识点:http请求与js及状态码)

304(Not Modified)状态码在网络请求中的意思是:所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
大白话是:你这客户端需要的资源没有被修改,还是原来的老数据,我服务端不会返回给你(你自己有干嘛还要我的),你用原来的数据就行了。

什么情况下会返回304

304是服务端设置的。服务端设置响应头:last-modified(一个时间):

res.setHeader('Last-Modified', XXXXX-GMT时间格式)

客户端拿到这个设置的时间后保存起来,再次请求时在请求头上带上这个时间:if-modified-since

  • 1.客户端首次请求服务端,拿到数据,服务端设Last-Modified。
  • 2.客户端拿到Last-Modified,并设置if-modified-since。
  • 3.客户端再次请求服务端。
  • 4.服务端对比if-modified-since时间与Last-Modified时间,如果时间相等,则返回304,否则返回200&新数据。

Etag 与last-modified
last-modified设置的时间最小单位是秒,如果想要更精确的时间就不太适用,比如12:13:25到12:13:26之间。

res.setHeader(etag: 'xxxx')

设置etag为一段哈希值,可以使用md5来生成。
nodejs中使用:

let crypto = require('crypto');
let md5 = crypto.createHash('md5');let etag = md5.update('xxxxxxxx').digest('base64');

客户端拿到这串哈希值保存,再次请求时请求头带上if-none-match

  • 1.客户端首次请求服务端,拿到数据,服务端设etag。
  • 2.客户端拿到etag,并设置if-none-match。
  • 3.客户端再次请求服务端。
  • 4.服务端对比if-none-match值与etag值,如果相同则返回304,否则返回新数据。
缓存的优先级

浏览器缓存数据有很多方法,有cookie、localstorage、sessionStorage、indexDB等,这些可以直接设置需要缓存的数据,其中有保存时间、容量大小的差距。
我们通过http也可以设置缓存,这就是常见的浏览器缓存中的强缓存与协商缓存。
协商缓存如上述内容。
强缓存可以通过响应头cache-control、Expires来设置,设置一个缓存的到期时间。

  • 网页首次加载,该请求的数据还是请求,此时服务端设置相应的强缓存与协商缓存。
  • 网页不是首次加载,如果设置了强缓存,数据则会从缓存中读取,不请求服务端。
  • 如果强缓存时间过期,则会请求服务端,服务端判断是否命中协商缓存,如果协商缓存时间或者哈希没变,则返回304。
  • 如果协商缓存时间对比不一样或资源变化,则数据重新被获取,返回200.

即都存在且生效的情况下:
强缓存 -> 协商缓存

cache-control -> expires -> Last-Modified -> Etag

协商缓存与状态码304相关推荐

  1. HTTP 状态码 304 缓存机制

    HTTP 状态码 304 缓存机制 交互流程 客户端第一次请求服务端的某个地址时,服务端会在响应时携带 ETag 与 Last-Modified 响应头,客户端下次再发送同一地址的请求时,会携带 If ...

  2. 状态码304的简单介绍

    参考: 百度百科.HTTP Status Code 304 状态码的详细讲解 304 是对客户端有缓存情况下服务端的一种响应. 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是客 ...

  3. HTTP状态码304与ETag详解

    总结一下,最近项目开发遇到的.由于缓存框架设计时,缓存请求文件时只以发起请求的url 为key,导致在客户端发起url 相同,传参类型不同的请求时,交替请求会出现,带上一次请求返回的etag ,进行下 ...

  4. HTTP:状态码304

    状态码304 相关头信息   * Last-Modified:响应头,表示当前资源的最后修改时间:   * If-Modified-Since:请求头,表示缓存的资源最后修改时间: 状态码304:表示 ...

  5. http状态码304缓存机制(强缓存和协商缓存-304)

    前言:好久没写博客了,今天早上闲着没事重新看了下http的304缓存机制.下面我就简单的讲下我的理解吧. 描述:首先我们先明白一点什么是状态码.对于我们开发来说,大家一说起http状态码,都能随口说几 ...

  6. 服务器缓存返回状态码,浏览器缓存,状态码200与304

    清除浏览器中的缓存,必须从服务端获取最新内容,但不是所有浏览器都支持.. 2.HTTP头信息 Expires:即在 HTTP 头中指明具体失效的时间(HTTP/1.0) Cache Control:m ...

  7. HTTP状态码304详解

    图和代码来源理解HTTP缓存和304状态码 下图是使用express启动了一个服务,启动之后浏览器访问两次localhost:8080所得请求.响应头 var express = require('e ...

  8. 返回状态码304 Not Modified详解

    第一次访问 200 鼠标点击二次访问 (Cache) 按F5刷新 304 按Ctrl+F5强制刷新 200 在客户端向服务端发送http请求时,若返回状态码为304 Not Modified 则表明此 ...

  9. http状态码304

    简单来说, 304状态码表示资源未被修改.当不是第一次访问一个静态页面或者图片时,就会得到这么一个提示.这个是服务器提示浏览器,这个资源没有发生改变,你直接使用上一次下载的就行,不需要重新下载.这样节 ...

最新文章

  1. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型
  2. 学了网络安全以后能做哪些岗位呢?来来来,带你们了解
  3. delphi程序项目创建和保存
  4. 学习笔记(04):Python网络编程并发编程-什么是socket
  5. LINUX任务(jobs)详解
  6. 力扣 两数相加 指针操作注意事项
  7. brackets作为html编辑器,为前端而生丨编辑器 Brackets 及配置推荐
  8. 5件最灵异的事~~~~~~~~~~~~~~~~~~转
  9. 程序员的算法课(13)-分治法
  10. linux中vi编辑器(转载)
  11. 手机WIFI的上行下行速度不同
  12. java解析字符串_java 拼接字符和解析字符串
  13. 全国2013年最新电子地图矢量数据超图格SGD、MAPINFO、GST、SMW、SHP格式等
  14. pandas删除最后一列_Python中pandas dataframe删除一行或一列:drop函数详解
  15. 我国的频段划分,请参考~
  16. jquery gotop插件
  17. 亿级流量电商JVM调优(转图灵学院)
  18. java gc roots_Java 虚拟机枚举 GC Roots 解析
  19. 实用的签到、日程表日历控件(可扩展)
  20. wget 和scp对比_Linux中curl命令和wget命令的使用介绍与比较

热门文章

  1. AIGW40N65H5英飞凌车规MOS管\原装现货\ASEMI代理
  2. h5 表单居中_div居中的几个方法 - 跛豪丶
  3. 【Java基础知识回顾篇】之打怪升级Day001
  4. css行高包含哪些,表示行高的css属性是什么
  5. [Acmer日志]2021/3/20星期六,天气多云,小冷
  6. Maven项目 (JeecgBoot)修改项目名和模块名方法
  7. python+selenium 中input标签 框无法选中和点击、输入等元素操作,如何触发该元素框数据加载
  8. 高频数据跟踪2021年1月第1周:钢材入冬后首次累库-20210107.PDF
  9. 服务器硬盘使用率应低于多少
  10. 局域网的特点是什么?它的基本组成是什么?