img 跨域 和 缓存

一个奇怪的问题,明明图片那边配置了允许跨域,但在禁用缓存的情况,js fetch 图片都正常。但不停用缓存时,就会有跨域问题。

图片所在域名是 b.com 

页面域名是 a.com

图片服务配置了Access-Control-Allow-Origin 允许a.com跨域访问

理论上,js fetch图片是没问题的,因为允许跨域。但实际上,遇到的场景是 在页面用img展示了图片后,通过js去fetch图片转base64时,报跨域。

定位问题步骤:

1. 查看network ,查看fetch 图片时发起的请求,报跨域。

2. 在console上运行代码fetch另一张图片,正常,network也有Access-Control-Allow-Origin

3. 在代码改用成功的那张图片地址,一切正常,在fetch时查看network发现,请求响应来自缓存

4. 勾选禁用缓存,原来有问题的图片,也能正常fetch了

5. 取消禁用缓存,换一张图片,再次跨域,查看原来 img的图片请求,确实没有Access-Control-Allow-Origin

结论: 当使用缓存时,img请求的图片没有响应头Access-Control-Allow-Origin,再次用js来fetch图片时复用了缓存请求,响应头并没有Access-Control-Allow-Origin,浏览器认为这个请求不支持跨域。

当不使用缓存时,fetch图片时重新发起了请求,此时响应头返回了Access-Control-Allow-Origin,支持跨域,于是正常。

一般我们不会去限制用户浏览器不能使用缓存,缓存是提高前端性能的一种有效手段。于是可以考虑,fetch时加入url参数来规避缓存,这样就能舒服的跨域请求图片了。

当然,如果图片本身就不允许你的域名跨域,再怎么取消缓存也无济于事。

参考:<img>图片 crossOrigin=anonymous 导致 onload error 失败 - 掘金

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 JavaScript 中的 `<img>` 标签加载跨域图片时,可能会遇到 "跨域问题" 的错误。这是因为浏览器在加载跨域图片时会应用同源策略,防止从其他域加载恶意代码。 为了解决这个问题,可以在服务器端设置响应头 `Access-Control-Allow-Origin`,允许特定域名访问图片。例如下面的代码设置允许 `https://example.com` 域名访问图片: ``` Access-Control-Allow-Origin: https://example.com ``` 如果你无法在服务器端设置响应头,可以使用 JavaScript 动态创建一个 `<img>` 标签,并将图片 URL 转换为一个可以通过 JavaScript 跨域加载的 URL。代码示例如下: ```javascript var img = new Image(); img.crossOrigin = "anonymous"; img.src = "https://example.com/image.jpg"; img.onload = function() { var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); var dataURL = canvas.toDataURL("image/png"); var img2 = new Image(); img2.src = dataURL; document.body.appendChild(img2); }; ``` 这段代码创建了一个 `<img>` 标签,并将其 `crossOrigin` 属性设置为 "anonymous",表示允许跨域请求。然后设置图片 URL 并等待加载完成。当图片加载完成后,使用 `<canvas>` 将图片绘制到 canvas 上,并将 canvas 转换为 base64 编码的数据 URI。最后创建另一个 `<img>` 标签,将数据 URI 设置为 `src` 属性,从而显示图片。这种方法可以通过 JavaScript 跨域加载图片,但需要注意的是,如果图片非常大,可能会导致内存不足的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值