crossorigin="anonymous"不是跨域开关,而是声明以无凭据cors模式加载资源;若服务端未返回access-control-allow-origin响应头,浏览器将在加载阶段拦截请求并报错。

加了 crossorigin="anonymous" 就不会发 Cookie,但前提是服务端没配错、浏览器也没忽略它——否则它根本不起作用。
为什么 crossorigin="anonymous" 不带 Cookie 却还报错?
因为这个属性不是“开关”,只是告诉浏览器:“请用 CORS 模式发起请求,且不附带凭据”。如果服务端没返回 Access-Control-Allow-Origin 响应头,浏览器在资源加载阶段就直接拦截,控制台会显示类似 Failed to load resource: the server responded with a status of 403,Network 面板里也看不到响应体或响应头。
- 常见误判:看到图片/脚本没加载出来,以为是
crossorigin导致的;实际是服务端压根没回 CORS 头,浏览器按最严策略拒收 - 注意
crossorigin="anonymous"会触发预检(比如请求带integrity或自定义 header 时),而某些 CDN 对 OPTIONS 请求默认不透传 CORS 头 - 如果你用的是本地开发服务器(如 vite dev server),它默认不返回 CORS 头,必须手动配置中间件或 proxy 规则
crossorigin="anonymous" 和同域脚本混用会怎样?
同域脚本加 crossorigin="anonymous" 一般不会出错,但没必要——浏览器仍会发 Origin 头,服务端若没配 Access-Control-Allow-Origin,反而可能意外触发预检或被拒绝(尤其 Nginx 默认不转发 Origin 头)。
- 同域脚本加了该属性,
window.onerror依然能捕获完整错误,但没收益;反而增加一次无意义的 Origin 校验开销 - 如果服务端对同域请求返回了
Access-Control-Allow-Origin: *,那它其实已“过度开放”,存在潜在安全风险 - 建议只在明确跨域的资源上使用,比如 CDN 上的
https://cdn.example.com/lib.js
服务端没配 CORS 头时,crossorigin="anonymous" 的真实行为
它不会让资源“变跨域”,也不会阻止加载——但会让 JS 无法安全读取内容。例如:
-
<img crossorigin="anonymous" src="https://other.com/photo.jpg?x-oss-process=image/resize,p_40">:图片仍能显示,但后续canvas.drawImage(img)会导致 canvas 被污染,toDataURL()抛SecurityError -
<script crossorigin="anonymous" src="https://other.com/app.js"></script>:脚本可执行,但如果出错,window.onerror只收到"Script error.",除非服务端同时返回Access-Control-Allow-Origin - 关键点:
crossorigin必须在设置src之前赋值;写成script.src = '...'; script.crossOrigin = 'anonymous';是无效的
最容易被忽略的是:CORS 头必须作用于资源本身(比如 .js 文件响应),而不是 HTML 页面。CDN 缓存、路径带查询参数(?v=2.1)、S3/OSS 的 bucket policy 都可能导致 CORS 头丢失——得逐个检查实际响应,不能只看配置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











