前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缓存竟也能导致跨域问题?

缓存竟也能导致跨域问题?

作者头像
Java技术栈
发布2019-11-11 23:31:58
3.5K0
发布2019-11-11 23:31:58
举报
文章被收录于专栏:Java技术栈Java技术栈

由于页面设计需要,页面展示图片,并可点击下载按钮进行下载(需要前端打包多个图片,所以需要使用ajax请求图片获得二进制内容,不能直接使用img或a进行下载),如图:

问题现象

图片存储再阿里云OSS,阿里云OSS的CORS设置的跨域并没有问题:

代码语言:javascript
复制
access-control-allow-methods: GET, POST, PUT, DELETE, HEAD
access-control-allow-origin: *
access-control-max-age: 600
代码语言:javascript
复制

打开页面图片能正常显示,但是下载(ajax请求图片)会因为跨域报错:

Access to XMLHttpRequest at '' from origin 'http://192.168.13.133:8888' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

  1. 同页面其他外站图片链接就可以正常使用,只有自己OSS的图片有问题
  2. 多次尝试发现network控制台禁用缓存情况下是没有问题的
  3. 禁用缓存下载图片后,再启用缓存,此时下载又没有问题了
  4. 即使强制刷新也仍然下载不了,network显示读取自本地缓存

基本可以猜测是缓存或者使用CDN的问题。而此时阿里工单也回复了:

描述情况基本一样

原因分析

什么是跨域及CORS配置此处不再详述

1、图片存储使用的阿里云OSS,提供默认的域名可以访问图片,只需要OSS设置跨域配置即可

2、使用了CDN,而CDN也同样需要跨域配置(没有配置)

3、页面直接img显示的图片,而img并不会触发跨域,所以当页面打开后img会请求到CDN的图片并缓存到本地,而缓存不带CORS配置,然后ajax请求直接访问本地图片,触发了同源限制,导致跨域报错

解决方法

1、直接使用默认的非CDN地址下载,url = url.replace('file.xxx.com', 'xxx.oss-cn-beijing.aliyuncs.com')替换域名等方式

2、防止使用缓存,ajax请求图片是加上随机参数,url = url + '?s=' + Math.random().toString()

3、配置CDN的CORS,使其直接返回跨域配置

来源:www.yuque.com/zhanghaofei/blog/vqc5g6

- END -

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-10,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 解决方法
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com