- 概述
协商缓存:
1. 客户端向服务端发送一个请求,请求相应的资源
2. 服务端向客户端发送一个响应,在响应头中携带两个关于缓存的信息,分别是 当前文件的唯一标识
(eTag)和 当前文件的最后一次修改时间(last-modified)
3. 客户端收到了响应文件和关于文件的缓存信息,并把缓存信息保存在客户端,但是更换了名称,把eTag
更名为if-none-match,把last-modified更名为if-modified-since。
4. 客户端第二次请求服务端,请求相应的资源,会在请求头上携带两个字段,就是之前已经请求过的文件
的缓存信息 if-none-match和if-modified-since
5. 服务端接收到了客户端的if-none-match和if-modified-since,然后会重新获取被请求文件的eTag和
last-modified,然后开始比较,如果两个都比较成功,则读取缓存,否则返回新的响应
6.如果走缓存,则服务端的响应状态码是304,并且不需要设置任何的响应内容
7.如果走缓存,则客户端接收到的状态码是304,并直接去读取缓存
8.如果不走缓存,则响应状态码是200,并且响应最新的数据,还要携带最新的eTag和last-modified
- web页面如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<h1>协商缓存</h1>
<ul>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
<li>1</li>
</ul>
</body>
</html>
- 协商缓存与服务器的自启动
const express = require("express");
const {
exec
} = require("child_process")
const path = require("path");
const etag = require("etag");
const {
promisify
} = require("util");
const fs = require("fs");
const {
resolve6
} = require("dns");
const app = express();
app.get("/", async (req, res) => {
const ifNoneMatch = req.headers["if-none-match"];
const ifModifiedSince = req.headers["if-modified-since"];
console.log(ifNoneMatch, ifModifiedSince);
const filePath = path.resolve(__dirname, "./index.html");
const rs = fs.createReadStream(filePath);
const stat = promisify(fs.stat);
const fileDetail = await stat(filePath);
const fileTime = fileDetail.mtime.toGMTString();
const fileEtag = etag(fileDetail);
if (ifNoneMatch === fileEtag && ifModifiedSince === fileTime) {
return res.status(304).end()
}
res.set("ETag", fileEtag);
res.set("Last-Modified", fileTime);
rs.pipe(res);
})
app.listen("3000", (err) => {
if (err) {
console.log(err);
return;
}
console.log("服务已经启动 http://127.0.0.1:3000");
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人