CORS是浏览器基于同源策略实施的安全机制,通过预检请求(OPTIONS)与服务器协商跨域权限;解决方式包括后端配置Access-Control-Allow-*响应头、开发期使用代理,禁用浏览器安全策略仅限调试。
CORS(Cross-Origin Resource Sharing,跨域资源共享)是浏览器的一种安全机制,用来限制网页脚本向不同源(协议、域名、端口任一不同)的服务器发起请求。它不是 JavaScript 的 bug,也不是后端“不给访问”,而是浏览器主动拦截了不满足策略的响应,控制台会报类似 Access to fetch at 'https://api.example.com' from origin 'http://localhost:3000' has been blocked by CORS policy 的错误。
核心原因是浏览器执行了同源策略(Same-Origin Policy),但又通过 CORS 机制提供了一种可控的“例外”方式。当前端发请求(尤其是带 credentials、非简单请求如 PUT/DELETE、自定义 header 等)时,浏览器会先发一个 预检请求(OPTIONS),询问服务器:“我这个跨域请求你允许吗?”——如果服务器没正确返回 Access-Control-Allow-* 相关响应头,浏览器就直接拒绝后续请求。
✅ 后端配置响应头(推荐,治本)
让服务端在响应中添加以下关键头(以 Express 为例):
Access-Control-Allow-Origin: http://localhost:3000(或 *,但带 credentials 时不能用 *)Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Headers: Content-Type, AuthorizationAccess-Control-Allow-Credentials: true(如需携带 cookie 或 auth token)✅ 开发阶段:用代理(前端友好,绕过浏览器
限制)
比如 Vue CLI 或 Vite 的 vite.config.js 中配置代理:
server.proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } }
fetch('/api/users'),开发服务器自动转发到后端,因同源(都走 localhost:3000)就不触发 CORS⚠️ 不推荐的方式(仅限调试,勿上线)
关闭浏览器安全策略(如 Chrome 启动时加 --disable-web-security)或装 CORS 插件——这些只影响本地浏览,无法解决用户真实访问时的问题,且存在安全风险。
credentials: 'include',后端 Access-Control-Allow-Origin 就不能写 *,必须指定具体域名Access-Control-Allow-Originn)credentials: 'include' 才会发送,后端也需配合 Allow-Credentials
基本上就这些。CORS 本质是浏览器和服务器之间的“协商协议”,关键在双方配合:前端明确需求(是否带凭证、什么方法),后端按需回应正确的头。不复杂但容易忽略细节。