字数
516 字
阅读时间
3 分钟
概述
xml
<script src="xxxx" crossorigin="anonymous"></script>有时候会看到这样的代码,设置了 crossorigin="anonymous" 这个属性,个人认知里面是跟跨域有关系的。但是仔细一想,本来 script 标签就是可以跨域请求资源的,那 crossorigin="anonymous" 这个设置是为了什么?
script 标签请求资源
- script 标签去请求资源的时候,request 是没有 origin 头的。
- script 标签请求跨域资源的时候,内部运行如果报错的话,
window.onerror捕获的时候,内部的error.message只能看到Script error.看不到完整的错误内容。这个应该是浏览器的安全策略。
javascript
window.addEventListener('error', function(msg, url, lineno, colno, error) {
console.log('error catch:', msg.message);
return false
})script 标签 crossorigin 属性
- 设置 crossorigin 属性后,script 标签去请求资源的时候,request 会带上 origin 头,然后会要求服务器进行 cors 校验,跨域的时候如果 response header 没有 'Access-Control-Allow-Origin' 是不会拿到资源的。cors 验证通过后,拿到的 script 运行内部报错的话,,window.onerror 捕获的时候,内部的 error.message 可以看到完整的错误信息。
- crossorigin 的属性值分为 anonymous 和 use-credentials。如果设置了 crossorigin 属性,但是属性值不正确的话,默认是 anonymous。
- anonymous 代表同域会带上 cookie,跨域则不带上 cookie,相当于 fecth 请求的 credentials: 'same-origin'。
- use-credentials 跨域也会带上 cookie,相当于 fetch 请求的 credentials: 'include',这种情况下跨域的 response header 需要设置 'Access-Control-Allow-Credentials' = true,否则 cors 失败
总结
- 设置了 crossorigin 就相当于开启了 cors 校验。
- 开启 cors 校验之后,跨域的 script 资源在运行出错的时候,window.onerror 可以捕获到完整的错误信息。
- crossorigin=use-credentials 可以跨域带上 cookie
参考
关于 script 标签你应该知道的 · Issue #1 · rainjay/blog · GitHub
CORS settings attributes - HTML(超文本标记语言) | MDN