Skip to content
字数
516 字
阅读时间
3 分钟

script crossorigin 属性 - 掘金

概述

xml
<script src="xxxx" crossorigin="anonymous"></script>

有时候会看到这样的代码,设置了 crossorigin="anonymous" 这个属性,个人认知里面是跟跨域有关系的。但是仔细一想,本来 script 标签就是可以跨域请求资源的,那 crossorigin="anonymous" 这个设置是为了什么?

script 标签请求资源

  1. script 标签去请求资源的时候,request 是没有 origin 头的。
  2. 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 属性

  1. 设置 crossorigin 属性后,script 标签去请求资源的时候,request 会带上 origin 头,然后会要求服务器进行 cors 校验,跨域的时候如果 response header 没有 'Access-Control-Allow-Origin' 是不会拿到资源的。cors 验证通过后,拿到的 script 运行内部报错的话,,window.onerror 捕获的时候,内部的 error.message 可以看到完整的错误信息。
  2. crossorigin 的属性值分为 anonymous 和 use-credentials。如果设置了 crossorigin 属性,但是属性值不正确的话,默认是 anonymous。
  3. anonymous 代表同域会带上 cookie,跨域则不带上 cookie,相当于 fecth 请求的 credentials: 'same-origin'。
  4. use-credentials 跨域也会带上 cookie,相当于 fetch 请求的 credentials: 'include',这种情况下跨域的 response header 需要设置 'Access-Control-Allow-Credentials' = true,否则 cors 失败

总结

  1. 设置了 crossorigin 就相当于开启了 cors 校验。
  2. 开启 cors 校验之后,跨域的 script 资源在运行出错的时候,window.onerror 可以捕获到完整的错误信息。
  3. crossorigin=use-credentials 可以跨域带上 cookie

参考

关于 script 标签你应该知道的 · Issue #1 · rainjay/blog · GitHub

CORS settings attributes - HTML(超文本标记语言) | MDN

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写