缓存原理

浏览器缓存分为强缓存和协商缓存

先检查是否过期,没有过期直接使用本地缓存。如果过期,查看是否使用协商缓存

协商缓存流程:
  1. 后端返回headers:
ETag: W/"1e3-1754f0e63af"
Last-Modified: Thu, 22 Oct 2020 06:45:44 GMT
  1. 前端请求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,浏览器使用旧文件。

缓存问题

  1. 如果不设置缓存时间(不设置cache-control或者expired),只设置协商缓存,会有缓存时间吗?

    有,若只设置了协商缓存,没有设置强缓存,则强缓存时间大多默认是(date-last-modified)/10,而date只会去浏览器请求时更新,所以不会出现永久不过期情况。
  2. a网站与b网站不同域名,但是却引用了相同地址的图片test.jpg(都是跨域引用),浏览器先去访问a网站,再去访问b网站,那么test.jpg会使用缓存吗?

    会,缓存时浏览器行为,与域名无关。

缓存引发的bug

  1. 修改了js,css,图片等静态文件,但是却没有生效

    html禁止缓存,并且在静态文件请求地址加查询参数 src="test.js?1"
  2. 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总结的更多相关文章

  1. nginx 与 浏览器缓存

    一.本地静态文件 location /html/{ rewrite ^(html/.*)$ /$1 break; root /data/static; expires 12h; etag off; i ...

  2. 网络协议HTTP TCP/UDP 浏览器缓存 Restful(十)

    一 TCP网络协议 1 建立TCP连接:三次握手原则 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分.客户端把这段连接的序号设定为随机数 A. 服务器端应当为一个合法的SY ...

  3. 由于未清除缓存引发的bug

    在写页面的时候,首先引入了本地react.js和react-dom.js 16版本(cjs)的文件,出现如下错误 发现bug后,将本地的react.js和react-dom.js文件改成16.2(um ...

  4. web性能优化:详说浏览器缓存

    TOC 背景 浏览器的总流程图 一步一步说缓存 朴素的静态服务器 设置缓存超时时间 html5 Application Cache Last-Modified/If-Modified-Since Et ...

  5. 理解web缓存 浏览器缓存

    为了: 控制缓存 遇到的现象: 1.开发的时候,浏览器会缓存你的文件,使得你的改动是无效的! 开发过程中:我们是不希望有缓存的. 但正是发布以后,我们是希望页面能够在浏览器缓存,这样用户的体验就会提高 ...

  6. nginx,控浏览器缓存,前端优化方案

    1,困惑 做web项目,对于开发者来说,一个最头痛的问题就是浏览器缓存,有缓存,js更改了,html更改了,发布服务器以后用户往往无法通过浏览器访问到最新的类容,需要用户主动去刷新页面, 因为一直做企 ...

  7. 关于引用JS和CSS刷新浏览器缓存问题

    有时候我们会碰到上线的新版本都要刷新一次缓存的问题.那是因为改了JS的内容,但是JSP引用的地方后面的字符串未发生改变导致浏览器读取浏览器缓存而不会重新加载新的JS内容,以下提供两种解决方式: 1.每 ...

  8. 浏览器缓存相关的Http头介绍:Expires,Cache-Control,Last-Modified,ETag

    转自:http://www.path8.net/tn/archives/2745 缓存对于web开发有重要作用,尤其是大负荷web系统开发中. 缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中 ...

  9. Nginx使用Expires增加浏览器缓存加速

    Max-age是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对的值,相对Request_time(请求时间). Expires它比max-age要麻烦点,Expires指定的时间分&q ...

随机推荐

  1. NoSuchMethodError: org.springframework.beans.factory.config.BeanDefinition.getResolvableType

    spring整合Mybatis报错: 解决方法: 检查maven依赖中的spring-jdbc和spring-webmvc是否版本一致 以下均为5.2.0.RELEASE版本 除此之外再检查是否有其他 ...

  2. 数据库SQL调优的几种方式

    1.创建索引 (1) 要尽量避免全表扫描,首先应考虑在where 及order by涉及的列上建立索引 (2) 在经常需要进行检索的字段上创建索引,一个表中的索引最好不要超过6个 2.避免在索引上使用 ...

  3. x86-TSO : 适用于x86体系架构并发编程的内存模型

    Abstract : 如今大数据,云计算,分布式系统等对算力要求高的方向如火如荼.提升计算机算力的一个低成本方法是增加CPU核心,而不是提高单个硬件工作效率. 这就要求软件开发者们能准确,熟悉地运用高 ...

  4. hystrix源码之请求合并

    请求合并 使用HystrixObservableCollapser可以将参数不同,但执行过程相同的调用合并执行.当调用observe.toObservable方法时,会向RequestCollapse ...

  5. Processing 高效控制管理图形方法(一)

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/62456299

  6. IDEA 条件断点 进行debug调试

    1. 鼠标左键在要断点的行号点击一下,打个断点 2.鼠标移动到断点处,然后点击一下鼠标右键,之后会弹出: 3.填写条件,可以使用该行中的代码对应的变量作为条件 4.点击Done按钮 至此条件断点设置完 ...

  7. Java知识系统回顾整理01基础01第一个程序02命令行格式编译和执行Java程序

    一.先看运行效果 在控制台下运行第一个Java程序,可以看到输出了字符串 hello world 二.准备项目目录 通常都会在e: 创建一个project目录 在这个例子里,我们用的是e:/proje ...

  8. Azure内容审查器之羞羞图审查

    上一篇 Azure 内容审查器之文本审查我们已经介绍了如果使用Azure进行文字内容的审核.对于社区内容,上传的图片是否含有羞羞内容也是需要过虑的.但是最为一般开发者自己很难实现这种级别的智能识别.但 ...

  9. javascript之判断数组的几种方法

    今天和小伙伴一起出去吃饭,有个小伙伴突然问我,你是前端是吧,问一下现在前端判断数组都有哪些方法,哈哈不知道是不是考我,当时没有说全,吃过饭后看了下自己以前的小笔记这里总结一下目前知道的所有对于数组的判 ...

  10. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二)

    Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二) 摘要 上一篇https://javaymw.com/post/59我们已经实现了基本的登录和t ...