缓存原理

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

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

协商缓存流程:
  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来辨别网站的缓存。

最新文章

  1. jvm系列(四):jvm调优-命令大全(jps jstat jmap jhat jstack jinfo)
  2. VS2013常用快捷键
  3. JAVA调用 keytool 生成keystore 和 cer 证书
  4. SQL语句 分页实现
  5. XCode修改公司名称和作者名称
  6. 企业QQ 增加在线交谈链接
  7. [sicp]huffman编码的实现 @ Scheme
  8. PowerDesigner的安装和数据库创建(转载)
  9. git使用记录(新手入门)
  10. 【OpenCV入门指南】第一篇 安装OpenCV
  11. [复变函数]第06堂课 2.1 解析函数的概念与 Cauchy-Riemann 方程 (续)
  12. Hive启动时的棘手问题的处理
  13. [Python]计算豆瓣电影TOP250的平均得分
  14. 框架中的HTML DOM Event 对象
  15. [kmp+dp] hdu 4628 Pieces
  16. JQuery操作DOM对象
  17. 页面刷新vuex数据消失问题解决方案 之 vuex中间件
  18. Vector简单介绍
  19. xml解析、写入遇到的坑
  20. cacheManager ABP中的缓存

热门文章

  1. C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转
  2. openstack核心组件——nova计算服务(7)
  3. 云计算openstack共享组件——Memcache 缓存系统(4)
  4. JWT理论理解
  5. rabbitmq的安装&学习
  6. 我还在生产玩 JDK7,JDK 15 却要来了!
  7. 通过adrci ips打包incident给oracle
  8. (转)Java中的值传递和引用传递
  9. Linux基本命令学习
  10. Kafka日志段读写分析