美文网首页前端
初识HTTP缓存-ETag

初识HTTP缓存-ETag

作者: 前端开发小匠 | 来源:发表于2018-08-04 19:13 被阅读0次

最近在学习网站性能优化相关的内容,关于网站优化点特别多而HTTP缓存也是比较重要的一部分,于是今天就着重看下HTTP缓存相关的内容加深下对此相关知识的理解和认识。自己动手通过简单的服务,看看其中的过程。

  1. ETag验证缓存的响应

在本地通过 express 启了一个非常简单的个服务,具体如下

// app.js

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('hello http')
})

app.listen(3000, () => {
  console.log('The server is running at http://127.0.0.1:3000/')
})

但是仔细看却发现,第一次进入页面http://127.0.0.1:3000/时,Status为200而再次刷新发现Status却是304

image.png image.png

仔细对比发现

  1. 第一次请求时候请求参数中并没有 If-None-Match 字段但是却有个Pragma;同时在请求的Response中有一个 ETag: W/"a-QFZ79AprHeNlMfPMKXyEUV+lyOg"字段。
  2. 刷新页面后再次请求在请求头中却有个 If-None-Match: W/"a-QFZ79AprHeNlMfPMKXyEUV+lyOg" ,If-None-Match 的值和第一次请求的ETag的值相同。

经过查询才了解原理浏览器会根据HTTP请求的ETag验证请求的资源是否发生了改变,如果它未发生变化,服务器将返回“304 Not Modified”响应,并且资源从浏览器缓存中读取,这样就不必再次下载请求。

由此看来整个的过程就是下面这样:

  1. 如果缓存中有ETag 令牌,客户端请求时会自动在“If-None-Match” HTTP 请求标头内提供 ETag 令牌。
  2. 服务器根据当前资源核对令牌,验证是否发生变化,将验证结果通知给客户端,客户端根据结果看看是否需要从缓存中读取还是发送资源请求。

补充一个很直白的 TCP协议的三次握手 的理解。

为了验证查证的结果,我又添加一个请求处理。这个过程是,客户端明确返回一个ETag, 但是这里每次请求的的返回值都不相同,这里简单的使用了个etag++

// app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('hello http');
})


// 验证ETag
let etag = 0;
app.get('/test', (req, res) => {
  etag++;
  res.set('ETag', etag);
  res.send('ETag');
})

app.listen(3000, () => {
  console.log('The server is running at http://127.0.0.1:3000/')
})
image.png

查看下 /test 地址的请求结果,会发现If-None-Match 的值和 Response中的 ETag值每次都不相同,并且是 浏览器会将每次的 ETag 值都缓存起来在下次请求的时候发送给服务器。这样一来,每次服务器每次校验的值都是不相同的,所以这种就没有做缓存,因此每次请求 /test 地址都是 200 的状态。

示例源码地址

相关文章

  • 初识HTTP缓存-ETag

    最近在学习网站性能优化相关的内容,关于网站优化点特别多而HTTP缓存也是比较重要的一部分,于是今天就着重看下HTT...

  • http缓存 cdn缓存

    一、ETag 初识HTTP缓存-ETag 刷新页面后再次请求在请求头中却有个 If-None-Match: W/"...

  • 前端缓存接口数据的实现

    前端缓存 API 接口数据,前端怎么知道数据是否变了,该不该取缓存的数据呢。可以采用 HTTP 协商缓存 ETag...

  • HTTP 缓存相关的响应头信息

    响应头信息有: Cache-Control // 控制缓存 Expire // 控制缓存 ETag // 校验缓存...

  • iOS 一些缓存使用技巧

    1 :一般缓存用苹果的url 缓存即可。2:缓存的过期处理 对于文件缓存借助ETag 或者Last-Modifie...

  • Etag

    Etag HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽.因为如果内容没有改变,Web服务...

  • [转载] 使用 HTTP 缓存:Etag, Last-Modif

    原文链接:https://harttle.land/2017/04/04/using-http-cache.htm...

  • 网络优化

    网络深度优化的点 -NSCache缓存、Last-Modified、ETag -失败重发、缓存请求有网发送 -DN...

  • webView网络缓存1 - ETag

    什么是”Etag”? - Entity Tags HTTP 协议规格说明定义ETag为“被请求变量的实体值” 。...

  • 移动端性能优化(2)

    缓存类 合理利用浏览器缓存 除了上面说到的使用Cache-Control、Expires、Etag和Last-Mo...

网友评论

    本文标题:初识HTTP缓存-ETag

    本文链接:https://www.haomeiwen.com/subject/rcgmvftx.html