#前端
记录下昨天Debug~
现网反馈部分用户海报下载功能点击没反应,查了之后发现是js执行xhr下载图标Icon时,显示跨域;单独尝试Get请求/浏览器直接打开图片Icon地址,又正常。
百思不得其解,CDN为啥会跨域呢?公司CDN也没有特别的跨域配置。
观察到一个特殊现象,打开F12 devtools后则不会报跨域错误;关闭则会稳定报错;
然后发现是F12开了disabled cache,于是定位缓存相关。
于是发现是因为这个图片Icon在前置的业务流程中,以Img标签的形式访问了一次,浏览器缓存住了这个Icon cdn地址的Http Response,但是CDN配置中,对于Img标签的访问回包里不会特殊设置跨域Header;于是在下次js执行xhr下载图标Icon时,命中浏览器缓存,直接返回缓存的Http Response,由于其中没有跨域头,所以请求被浏览器拦截,提示报错。
临时应对:xhr下载图标Icon时候,给CDN地址后面+Random参数,规避缓存
后续:应该和CDN侧讨论这类问题,对于Img等返回是否也应该返回跨域的Header配置
记录下昨天Debug~
现网反馈部分用户海报下载功能点击没反应,查了之后发现是js执行xhr下载图标Icon时,显示跨域;单独尝试Get请求/浏览器直接打开图片Icon地址,又正常。
百思不得其解,CDN为啥会跨域呢?公司CDN也没有特别的跨域配置。
观察到一个特殊现象,打开F12 devtools后则不会报跨域错误;关闭则会稳定报错;
然后发现是F12开了disabled cache,于是定位缓存相关。
于是发现是因为这个图片Icon在前置的业务流程中,以Img标签的形式访问了一次,浏览器缓存住了这个Icon cdn地址的Http Response,但是CDN配置中,对于Img标签的访问回包里不会特殊设置跨域Header;于是在下次js执行xhr下载图标Icon时,命中浏览器缓存,直接返回缓存的Http Response,由于其中没有跨域头,所以请求被浏览器拦截,提示报错。
临时应对:xhr下载图标Icon时候,给CDN地址后面+Random参数,规避缓存
后续:应该和CDN侧讨论这类问题,对于Img等返回是否也应该返回跨域的Header配置