浏览器缓存引起的bug总结
缓存原理
浏览器缓存分为强缓存和协商缓存
先检查是否过期,没有过期直接使用本地缓存。如果过期,查看是否使用协商缓存
协商缓存流程:
- 后端返回headers:
ETag: W/"1e3-1754f0e63af"
Last-Modified: Thu, 22 Oct 2020 06:45:44 GMT
- 前端请求headers:
If-Modified-Since: Thu, 22 Oct 2020 06:26:38 GMT
If-None-Match: W/"1ef-1754efce5e8"
首先 If-Modified-Since与Last-Modified对比,这儿最后修改是在45分,缓存的旧文件是在26分,所以直接返回200及新文件。
若 两个时间相等,则对比etag与If-None-Match,若不同,则返回200,相同则返回304,浏览器使用旧文件。
缓存问题
- 如果不设置缓存时间(不设置cache-control或者expired),只设置协商缓存,会有缓存时间吗?
有,若只设置了协商缓存,没有设置强缓存,则强缓存时间大多默认是(date-last-modified)/10,而date只会去浏览器请求时更新,所以不会出现永久不过期情况。 - a网站与b网站不同域名,但是却引用了相同地址的图片test.jpg(都是跨域引用),浏览器先去访问a网站,再去访问b网站,那么test.jpg会使用缓存吗?
会,缓存时浏览器行为,与域名无关。
缓存引发的bug
- 修改了js,css,图片等静态文件,但是却没有生效
html禁止缓存,并且在静态文件请求地址加查询参数 src="test.js?1" - canvas使用跨域图片生成新图片失败(非代理方式)
首先后端必须配合同意跨域。
前端img加上crossOrigin属性
const img = new Image
img.setAttribute('crossOrigin', 'anonymous')
img.src='path-to-img'
img.onload=nextstep
如此,大概可以使用ctx.drawImage(img, x0,y0,x1,y1);canvas.toDataURL()了。
但是有一种例外,如果文件服务器,允许跨域,但access-control-allow-origin值不是*,并且没有设置cache-control:no-cache。那么a网站使用了跨域,b网站再使用相同图片。a网站请求图片跨域access-control-allow-origin:a.com,但是b网站去跨域请求时,浏览器直接动用缓存,此处直接跨域失败。
因此网上有人提出方法:在b网站使用图片时使用:img.src=url+'?' + Math.random(),但是无法缓存,可以使用:img.src=url+'?'+location.origin来辨别网站的缓存。
浏览器缓存引起的bug总结的更多相关文章
- nginx 与 浏览器缓存
一.本地静态文件 location /html/{ rewrite ^(html/.*)$ /$1 break; root /data/static; expires 12h; etag off; i ...
- 网络协议HTTP TCP/UDP 浏览器缓存 Restful(十)
一 TCP网络协议 1 建立TCP连接:三次握手原则 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分.客户端把这段连接的序号设定为随机数 A. 服务器端应当为一个合法的SY ...
- 由于未清除缓存引发的bug
在写页面的时候,首先引入了本地react.js和react-dom.js 16版本(cjs)的文件,出现如下错误 发现bug后,将本地的react.js和react-dom.js文件改成16.2(um ...
- web性能优化:详说浏览器缓存
TOC 背景 浏览器的总流程图 一步一步说缓存 朴素的静态服务器 设置缓存超时时间 html5 Application Cache Last-Modified/If-Modified-Since Et ...
- 理解web缓存 浏览器缓存
为了: 控制缓存 遇到的现象: 1.开发的时候,浏览器会缓存你的文件,使得你的改动是无效的! 开发过程中:我们是不希望有缓存的. 但正是发布以后,我们是希望页面能够在浏览器缓存,这样用户的体验就会提高 ...
- nginx,控浏览器缓存,前端优化方案
1,困惑 做web项目,对于开发者来说,一个最头痛的问题就是浏览器缓存,有缓存,js更改了,html更改了,发布服务器以后用户往往无法通过浏览器访问到最新的类容,需要用户主动去刷新页面, 因为一直做企 ...
- 关于引用JS和CSS刷新浏览器缓存问题
有时候我们会碰到上线的新版本都要刷新一次缓存的问题.那是因为改了JS的内容,但是JSP引用的地方后面的字符串未发生改变导致浏览器读取浏览器缓存而不会重新加载新的JS内容,以下提供两种解决方式: 1.每 ...
- 浏览器缓存相关的Http头介绍:Expires,Cache-Control,Last-Modified,ETag
转自:http://www.path8.net/tn/archives/2745 缓存对于web开发有重要作用,尤其是大负荷web系统开发中. 缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中 ...
- Nginx使用Expires增加浏览器缓存加速
Max-age是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对的值,相对Request_time(请求时间). Expires它比max-age要麻烦点,Expires指定的时间分&q ...
随机推荐
- 解决spark streaming集成kafka时只能读topic的其中一个分区数据的问题
1. 问题描述 我创建了一个名称为myTest的topic,该topic有三个分区,在我的应用中spark streaming以direct方式连接kakfa,但是发现只能消费一个分区的数据,多次更换 ...
- docker 搭建私有云仓库
docker搭建私有仓库 registry私有仓库 下载docker-distribution软件包 yum install epel-release yum install docker-dis ...
- Vue render函数 函数时组件 jsx
常规组件使用 定义组件 components/list/list.vue <template> <ul> <li v-for="(item, index) in ...
- linux操作指南-01
目录 1.1 MBR 1.2 装双系统的坑 1.3 主机硬盘的主要规划 前言:记录下最近在看的鸟哥Liunx私房菜,虽然不是第一次看了..想记录几章开发中用的比较多的部分大致是以下几个章节 第3章 主 ...
- 趣图:普通人讲故事 VS 程序员讲故事
扩展阅读 趣图:我说自己菜 vs 大佬说自己菜 趣图:客户需求VS客户预算 趣图:在外行人眼中的程序员 如何处理前任程序员留下的代码 一个故事讲清楚NIO
- 常用JVM 启动参数解析
https://www.jianshu.com/p/a17dcef57559 https://www.cnblogs.com/zkyefei/p/9334562.html
- spring ioc 源码分析之-- beanDefinition的加载过程以及ComponentScan,@componet,@import @Bean等注解解析过程
背景:我们启动主启动类后,相应的bean就被扫描进来了,原理是啥? 实现该功能的主要核心类就是:ConfigurationClassPostProcessor,我们看看他的继承体系: 它实现了Bean ...
- OpenCV图像处理学习笔记-Day03
OpenCV图像处理学习笔记-Day03 目录 OpenCV图像处理学习笔记-Day03 第31课:Canny边缘检测原理 第32课:Canny函数及使用 第33课:图像金字塔-理论基础 第34课:p ...
- 编程体系结构(05):Java多线程并发
本文源码:GitHub·点这里 || GitEE·点这里 一.多线程导图 二.多线程基础 1.基础概念 线程是操作系统能够进行运算调度的最小单位,包含在进程之中,是进程中的实际运作单位.一条线程指的是 ...
- 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法
065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...