http协商缓存和强缓存

news/2024/5/12 8:56:24

强缓存

强缓存则不需要向服务器发送请求,而是从浏览器读取缓存内容(内存缓存|硬盘缓存)

  • 内存缓存:存储在浏览器内存中,一般刷新浏览器会从内存缓存中获取到缓存内容,优点速度快,缺点关闭浏览器缓存丢失
  • 硬盘缓存:存储在计算机硬盘中,空间大,读取效率慢
强缓存案例(expires)

1 Expires:该字段指定响应的到期时间,既资源不在被视为有限的日期和时间,它是一个有限的HTTP/1.0 的头部字段,仍然被一些服务端和客户端使用。

Expires的判断机制是:当客户端请求资源时,会获取本地时间戳,然后拿本地时间戳与Expires设置的时间做对比,如果对比成功,则走强缓存,对比失败,则向服务器发送请求

import express from "express";
import cors from "cors"; // 跨域
import crypto from "node:crypto";
import fs from "node:fs";const app = express();
app.use(cors()); // 解决跨域// 动态资源接口缓存
// Expires 强缓存
// 使用new Date 转换为UTC时间,到这个时间之前,都可进行缓存住
app.get("/api", (req, res) => {res.setHeader("Expires", new Date("2024-5-6 12:23:45").toUTCString());res.send("hello");
});app.listen(3000, () => {console.log("server running is 3000");
});

html调用

<!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></head><body><button id="btn">测试缓存</button><script>const btn = document.getElementById("btn");btn.onclick = function () {fetch("http://localhost:3000/api");};</script></body>
</html>

2 Cache-Control 缓存 (配置内容)

  • max-age:浏览器资源缓存的时长(秒)。
  • no-cache:不走强缓存,走协商缓存。
  • no-store:禁止任何缓存策略。
  • public:资源即可以被浏览器缓存也可以被代理服务器缓存(CDN)。
  • private:资源只能被客户端缓存。
import express from "express";
import cors from "cors"; // 跨域
import crypto from "node:crypto";
import fs from "node:fs";const app = express();
app.use(cors());// Cache-Control 强缓存
// 第一个参数public: 表示任何服务器都可以缓存包括代理服务器,CDN
// 若设置为private: 表示只能浏览器进行缓存, 不包含代理服务器
// max-age: 表示缓存多长时间,以 秒 为单位
// Expires Cache-Control 同时出现的话,则依Cache-Control 设置的max-age时间为准
app.get("/api2", (req, res) => {res.setHeader("Cache-Control", "public,max-age=10");res.send("Cache-Control");
});app.listen(3000, () => {console.log("server running is 3000");
});

html 调用

<!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></head><body><button id="btn">测试缓存</button><script>const btn = document.getElementById("btn");btn.onclick = function () {fetch("http://localhost:3000/api2");};</script></body>
</html>

协商缓存

  • 缓存机制:强缓存会优先于协商缓存。若是不存在强缓存,则在协商缓存中,客户端会发送带有缓存数据标识的请求头部字段,向服务器验证资源的有效性。服务器会根据客户端发送的协商缓存字段(如If-Modified-Since和If-Node-Match)来判断资源是否发生变化。如果资源未发生修改,服务器会返回状态吗:304(Not Modified),通知客户端可以使用缓存的版本。如果资源发生变化,服务器将返回最新的资源,状态码为:200

  • 协商缓存(Last-Modified)需与If-Modified-Since配合

Last-Modified 和 If-Modified-Since:服务器通过 Last-Modified 响应头告知客户端资源的最后修改时间。客户端在后续请求中通过 If-Modified-Since 请求头携带该时间,服务器判断资源是否有更新。如果没有更新,返回 304 状态码。

import express from "express";
import cors from "cors"; // 跨域
import crypto from "node:crypto";
import fs from "node:fs";const app = express();
app.use(cors());// 协商缓存const getFileModfiedTime = () => {return fs.statSync("./index.js").mtime.toISOString();
};app.get("/api3", (req, res) => {// 获取浏览器设置的if-modified-sinceconst ifModifiedSince = req.headers["if-modified-since"];const modifiedTime = getFileModfiedTime();// 如果浏览器的时间 与 服务器给设置的时间一致,则走协商缓存if (ifModifiedSince === modifiedTime) {console.log("缓存了");res.statusCode = 304;res.send();return;}// 设置取消强缓存,使用协商缓存res.setHeader("Cache-Control", "no-cache");// 服务器 设置 协商缓存 时间res.setHeader("Last-Modified", modifiedTime);res.send("Last-Modified");
});app.listen(3000, () => {console.log("server running is 3000");
});
  • 协商缓存 ETag 需与 if-none-match 配置
import express from "express";
import cors from "cors"; // 跨域
import crypto from "node:crypto";
import fs from "node:fs";const app = express();
app.use(cors());// Etag 可通过文件生成hash
const getFileHash = () => {return crypto.createHash("sha256").update(fs.readFileSync("index.js")).digest("hex");
};app.get("/api3", (req, res) => {// 获取浏览器设置的if-modified-sinceconst ifNoneMatch = req.headers["if-none-match"];const etag = getFileHash();// 如果浏览器的时间 与 服务器给设置的时间一致,则走协商缓存if (ifNoneMatch === etag) {console.log("缓存了");res.statusCode = 304;res.send();return;}// 设置取消强缓存,使用协商缓存res.setHeader("Cache-Control", "no-cache");// 服务器 设置 协商缓存 时间res.setHeader("ETag", etag);res.send("Etag");
});app.listen(3000, () => {console.log("server running is 3000");
});
  • 同时设置了ETag 和Last-Modified 则Etag会优先级更高,etag相同,在用Last-Modified进行判断对比。

  • 既然有了Last-Modified为什么要用Etag
    1 Last-Modified以秒为单位,如果不超过1s内不会检测到资源发送改变。
    2 资源走完一个生命周期回到原来的状态,其实没发生改变,但会会判断发生改变。
    3 因为Etghash值内容是唯一的,通过对比就很快知道资源是否发送改变。


http://www.mrgr.cn/p/00416882

相关文章

MySQL学习之explain

from之后的查询得到的表叫做衍生表,是临时表数据,生成临时表之后的数据是无法使用索引的,如果数据量大查询效率就会比较低,这就是查询要尽量少使用子查询这些临时表。explain详解 id: 表示查询序号,也可以表示优先级;当值都不一样的时候,值越大表示优先级越高,越先执行…

实验12-使用keras预训练模型完成猫狗识别

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 运行结果: 这里我用Gpu进行加速,训练一回9秒,如果不启用gpu,训练一回会很慢。 代码:#-*- codeing = utf-8 -*- #@Time : 2022/10/2 11:44 #@Author : 程浩 #@File : 猫狗识别.py #@Software: PyCharm import tensor…

KVM虚拟机迁移(静态)

1.查看虚拟机状态,确认关闭状态 virsh list --all 2.查看虚拟机文件位置 virsh domblklist zabbix3.导出配置文件并查看导出文件 virsh dumpxml zabbix > /root/zabbix.xml 4.把刚导出的配置文件传到目的服务制定路径(路径为虚拟机配置文件位置)scp zabbix.xml 10.10.7.1…

实验11-使用keras完成逻辑回归

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 运行结果: 代码:import numpy as npfrom keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten import matplotlib.pyplot as plt from sklearn import datasets# 样本数据集…

【工具-PyCharm】

工具-PyCharm ■ PyCharm-简介■ PyCharm-安装■ PyCharm-使用■ 修改主题■ 设置字体■ 代码模板■ 解释器配置■ 文件默认编码■ 快捷键■ 折叠■ 移动■ 注释■ 编辑■ 删除■ 查看■ 缩进■ 替换 ■ PyCharm-简介 官方下载地址 Professional&#xff1a;专业版&#xff0…

Linux KASAN使用与实现原理

一、KASAN工具使用 KASAN工具&#xff1a;Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具&#xff0c;主要功能是检查内存越界访问和使用已释放内存的问题。 1.1 KASAN宏控开关 KASAN有三种模式&#xff1a;1.通用KASAN&#xff1b;2.基于软件标签的KASAN&…

实验8-1tensorboard可视化+实验8-2tensorboard案例

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 实验8-1tensorboard可视化运行结果:代码:import tensorflow as tf# 创建默认图 graph = tf.compat.v1.get_default_graph()# 定义命名空间 with graph.as_default():with tf.name_scope(input):# fetch:就是同时运行多…

科技论文网站:中国科技论文在线

文章目录 1. Intro2. Main3. Cons Evaluation彩蛋&#xff1a;科学素质 这是作者最后一次发 这种类型的宣传 科普文章 1. Intro 中国科技论文在线是经教育部批准&#xff0c;由教育部科技发展中心主办&#xff0c; 利用现代信息技术手段&#xff0c;打破传统出版物的概念&…

虚方法

若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法。虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允许有static,abstract,或override修饰符虚方法不能是私有的,因此不能…

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…

RPC(远程过程调用)详解

一、RPC是什么 RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 二、RPC需要解决的问题 1、Call ID映射 我们怎么告诉远…

【基础算法总结】双指针算法二

双指针 1.有效三角形的个数2.和为S的两个数字3.和为S的两个数字4.四数之和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.有效三角形的个数…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源&#xff08;踩坑记录版&#xff09; 此篇仅为踩坑记录&#xff0c;并未成功更换高速镜像源&#xff0c;实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

京东web端h5st—4.7逆向分析

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6Ly93d3cuamQuY29tLw== 分析流程了解h5st 看了sha256相关加密算法逻辑b…

API和微服务设计的优化方式有哪些?

在构建响应迅速、用户体验良好的应用程序中&#xff0c;API性能的优化至关重要。在构建高性能的API时&#xff0c;采取综合策略是至关重要的。通过采用一系列策略&#xff0c;我们可以确保API在处理请求时高效运行&#xff0c;提供流畅的服务。 一、API和微服务设计的优化可以…

XYCTF2024-web-wp

怎么全是傻逼绕过题。 不想评价,就随便打着玩,除了最后一道java反序列化搞心态,其他的ak了:简单题不想说,http注意一下代理是用Via就行,warmup直接:http://xyctf.top:37034/?val1=240610708&val2=QNKCDZO&md5=0e215962017&XYCTF=240610708&XY=24061070…

深入mysql索引

1. 索引 索引是对数据库表中一列或多列的值进行排序的一种结构。 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。 简单类比…

平衡树炫酷科技

炫酷平衡树科技标题是吸引你点进来的 Case 1 LCT 的 access 操作应该可以实现某种区间覆盖的操作(听同学讲的,具体的还待讨论) Case 2 众所周知,可并堆中左偏树合并是这样写的(记 \(dist\) 为 \(rd\)): merge(A, B)if !A: return Bif !B: return Aif B.val > A.valsw…

杰发科技AC7840——ADC简介(1)_双路ADC同时使用

0. 简介 1. 特性 2. 双路ADC Sample里面没有双路的&#xff0c;以为那个规则组只有一个通道&#xff0c;看了外设寄存器才发现&#xff0c;原来他的通道是双路的。 注意1: ADC硬件引脚的配置 注意2: 规则组长度设置和 RSEQ序列号和CH通道号组合应该就对应了转换顺序&#xff0…

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型&#xff0c;这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干&#xff0c;但还是要分离训练&#xff0c;而且不是…