一个Bug搞懂浏览器缓存策略

news2024/11/20 8:32:56

最近项目遇到一个问题,发版之后,用户需要清除缓存才可以访问到最新的应用,但是我们访问却可以正常。经过1天的研究搞懂了浏览器缓存的机制,记录下分析轨迹。

浏览器缓存基础知识

浏览器强缓存和协议缓存都是用来提高网页加载速度和减少网络传输的技朧。

强缓存

浏览器强缓存是通过设置HTTP响应头中的Cache-Control和Expires字段来指定浏览器在一定时间内直接从本地缓存中获取资源,而不会向服务器发送请求。这样可以减少网络传输时间,加快页面加载速度。常用的设置有max-age和s-maxage,分别表示资源的缓存时间。

在这里插入图片描述

命中强缓存条件

  1. Cache-Control: max-age=xxx
  2. 响应头有 Expires
  3. 响应头存在ETagLast-Modified(协商缓存)且 不存在Cache-Control:no-cache

强缓存非常有必要设置过期时间,如果没有设置过期时间,新系统升级之后浏览器内有强缓存,默认是走强缓存的。

协议缓存

协议缓存是通过使用ETag和Last-Modified字段来实现的。服务器在返回资源时会生成一个唯一的ETag标识和最后修改时间,浏览器在下次请求资源时会将这些信息发送给服务器,服务器根据这些信息判断资源是否发生变化,如果没有变化则返回304 Not Modified状态码,告诉浏览器直接从缓存中获取资源。这样可以减少网络传输和服务器负载。

协议缓存过程:

  1. 第一次请求服务器,服务器返回200状态码、Last-Modified时间戳、ETag签名和完整资源
  2. 浏览器保存资源内容,以及Last-Modified和ETag值
  3. 再次请求浏览器带上If-Modified-Since(值为上次服务器返回的Last-Modified)和If-None-Match(上次服务器返回的ETag)请求头
  4. 服务器收到请求后,对比当前资源文件的最后修改时间 是否等于 If-Modified-Since 以及资源文件的ETag 是否等于 If-None-Match (ETag优先级高于Last-Modified)
  5. 如果相同则返回304,客户端使用缓存
  6. 如果不相同则服务器返回资源,且返回新的ETag 和 Last-Modified,并更新到缓存

在这里插入图片描述

浏览器缓存流程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

对于同一个url资源,不管服务器有没有更新资源,只要浏览器缓存时效未过期,都不会主动向服务器重新请求的

问题

系统升级之后,一部分用户反馈访问的还是旧系统,清除缓存之后才能访问新系统。

清除缓存这个问题对于开发来说是一个常规操作,甚至用户也成了默认行为,一直也没有彻底研究过,领导要求解决,趁这个机会研究下浏览器缓存机制。

f12 对界面进行了跟踪,定位到用户行为:

  1. 输入网址
  2. 回车
  3. 网站index.html 没有到服务器,直接 form disk cache

在这里插入图片描述

分析问题

现在访问直接走了磁盘缓存,没有走服务器。下面看下目前的请求和返回头。

在这里插入图片描述
因为Cache-Control: max-age=0 所以触发了强缓存的命中条件,同时如果本地没有强缓存的时候,触发协议缓存。

表现如下:

  1. 用户如果有强缓存则不访问服务器 (旧的系统)
  2. 如果之前没有访问的,没有强缓存或者失效的。第一次访问服务器返回200和资源并记录ETag 和 Last-Modified,第二次会304 走协商缓存。

如何修改

系统更新,用户的强缓存没有过期,直接走了强缓存,导致没有访问服务器最新资源。

三种方式修改:

  1. 使用强缓存,给强缓存设置短暂的过期时间比如1分钟
  2. 不使用强缓存,使用协商缓存
  3. 不使用缓存

建议直接在服务器更改比如nginx 、tomcat 。 客户端优先级低会被服务器覆盖掉。

强缓存设置过期时间

设置强过期的缓存时间为60秒,第一次请求服务器,如果60s之内请求走强缓存不访问服务器,过了时间之后走协商缓存。

设置max-age=60s

nginx 配置:
在这里插入图片描述

在这里插入图片描述

不使用强缓存,使用协议缓存

设置Cache-Control no-cache 不使用强制缓存

nginx 配置:
在这里插入图片描述

在这里插入图片描述

不缓存,每次都刷新

nginx 配置:
在这里插入图片描述
在这里插入图片描述

总结

缓存策略浏览器设置还是比较合理的,主要是强缓存带来的速度是非常快的,这样就存在风险。遇到问题还是需要仔细的分析,而不是知道了固有手段当成了正常流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1478423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中简单正则获取百度新闻页面所有超链接示例

一、示例代码: import re import requestsheaders {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/""85.0.4183.83 Safari/537.36"} resp requests.get(http://news.…

135.乐理基础-半音是小二度吗?全音是大二度吗?三全音

内存参考于:三分钟音乐社 上一个内容:134.乐理基础-音程名字的简写-CSDN博客 上一个内容里练习的答案: 半音可以与小二度划等号吗?全音可以和大二度划等号吗? 严格来说它们是不能划等号的,半音与全音是侧…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径:C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它,修改一下窗口大小 把这两行改成如下所示 运行dos,黑框中输入mou…

【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…

复现nerfstudio并训练自己制作的数据集

网站:安装 - nerfstudio GitHub - nerfstudio-project/nerfstudio:NeRF 的协作友好工作室 安装之前要确保电脑上已经有CUDA11.8或以上版本(更高版本的可以安装11.8的toolkit) 创建环境 conda create --name nerfstudio -y pyt…

如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一个随身…

基于视觉识别的自动采摘机器人设计与实现

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展,农业生产效率与质量的提升成为重要的研究对象。其中,果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下,而且在劳…

AI智能电销机器人效果怎么样?呼叫部署

我们的生活早已变得无处不智能,从智能手机到无人车、虚拟VR到智能家居,你迎接的每一个清晨、享受的每一个夜晚,可能都离不开智能设备的服务。 工作中,智能化产业也正在影响着企业,电销机器人正在帮助各大企业获得更高的…

【C++】结构体类

文章目录 问题提出一、结构体1.1结构体的声明1.1.1正常定义的结构体1.1.2在声明结构体的同时声明变量1.1.3typedef1.1.4成员变量 1.2结构体成员变量的使用1.2.1成员运算符 .1.2.2成员运算符 -> 1.3内存对齐1.3.1什么是内存对齐1.3.2内存对齐原则1.3.3结构体成员的定义顺序 1…

八股文打卡day24——数据库(1)

面试题:左连接和右连接的区别? 我的回答: 左连接的SQL语句是:左表 left join 右表 on 连接条件,表示以左表为基础,将左表的的所有记录与右表进行连接。即使右表中没有与左表匹配的记录,左连接…

【InternLM 实战营笔记】大模型评测

随着人工智能技术的快速发展, 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型,开辟了自然语言模型生成式预训练的路线。沿着这条路线,随后又陆续发布了GPT-2和GPT-3模型。与此同时,谷歌也…

算法修炼-动态规划之斐波那契数列模型

一、动态规划的算法原理 这是本人动态规划的第一篇文章,所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满dp表(一段数组)。首先要先确定好dp表每个位置的值所代表的含义是什么&#xff0c…

Spring底层源码分析

spring依赖注入底层原理解析 spring之bean对象生命周期步骤详情 流程: UserService.class —>推断构造方法—>普通对象----依赖注入------>初始化(afterPropertiesSet方法)------>初始化后(AOP)------…

WEB漏洞 逻辑越权之支付数据篡改安全

水平越权 概述:攻击者尝试访问与他拥有相同权限的用户的资源 测试方法:能否通过A用户操作影响到B用户 案例:pikachu-本地水平垂直越权演示-漏洞成因 1)可以看到kobe很多的敏感信息 2)burp抓包,更改user…

react路由基础

1.目录 A. 能够说出React路由的作用 B. 能够掌握react-router-dom的基本使用 C. 能够使用编程式导航跳转路由 D. 能够知道React路由的匹配模式 2.目录 A. React路由介绍 B. 路由的基本使用 C. 路由的执行过程 D. 编程式导航 E. 默认路由 F. 匹配模式 3.react路由介绍 现代…

USB-C接口:办公新宠,一线连接笔记本与显示器

USB-C接口如今已成为笔记本与显示器连接的优选方案。无需担心正反插错,支持雷电4和DP视频信号输出,高速数据传输,还有最高100W的快充功能,真是方便又实用! 一线连接,多功能融合 通过这个接口,你…

Cookie、Session和JWT

摘要:Cookie、Session和JWT都不是什么新的技术了,最近用到了就比较和总结下。 我们知道http协议是无状态的,用户登录后如何验证和保存用户状态呢?下面来介绍 1. 使用Cookie和Session验证登录状态 session是保存在服务端的一种数…

笑营宝高校选修课报名考勤系统源码开发方案

一、项目背景与目标 (一)项目背景 随着高等教育的普及和教学模式的不断创新,高校选修课程体系日趋复杂多变。学生对课程选择的自由度提高,使得传统的选课和考勤管理方式变得繁琐且效率低下。目前,许多高校仍然采用纸…

Visio使用笔记

记录一下需要的常用操作 圆角矩形的弧度调整 如果一开始创建的是圆角矩形,可以菜单栏先改为矩形 取消箭头的对齐吸附 alt F9,取消勾选 忘记快捷键,可以菜单栏找到视图,点击视觉帮助右下角的小箭头,引出上面的界面…

【OpenGauss源码学习 —— 执行算子(Nest Loop 算子)】

执行算子(Nest Loop 算子) 概述Nest Loop 算子ExecInitNestLoop 函数ExecNestLoop 函数ExecEndNestLoop 函数ExecReScanNestLoop 函数 总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果…