最近在做海报分享的功能,其中一个需求是接口给出海报,然后需要在上面加上二维码,
图片可以正常访问到,但是调用toDataUrl 合成图片的时候报错, 报错类似
Uncaught DOMException: Failed to execute ‘xxx on ‘CanvasRenderingContext2D’: The canvas has been tainted by cross-origin data.
查了下原因是同源策略canvas出于安全因素认为不同源的图片会使画布受到”污染“,从而做了一些操作限制。
于是搜了下资料,很多文章都说加载图片的时候加上 img.setAttribute('crossOrigin', 'anonymous') , 或者加上时间戳,我试了下都没有生效,可能与图床是阿里云的有关,反而引起了跨域,发现图片请求上面带上了我自己的origin,随后找到后端让加上跨域,之后可以正常访问并且生成图片了。
后端可能出于安全考虑没有开放给所有域名 ,只是加了个白名单,给线上所有环境的域名,比如*.test123.io,这样部署过后的项目可以正常访问图片资源了,但我本地用localhost域名的项目还是会被跨域限制。后端跟我说可以改host文件,我搜了下,就get到了一个前端跨域的小技巧, windows ctrl + r 输入drivers 找到 etc 下面的host文件
本机ip dev.test123.io
把一个平时开发生产用不到的假域名dev.test123.io 映射到本机ip上, 再用假域名打开本地项目,这样就可以伪装成白名单内的域名。不过这样可能会引发其他静态资源的跨域,需要结合具体情况使用。