5月30日 19:58

Chrome 为什么会拦截跨域请求?前端该怎么解决?

Chrome 拦截跨域是同源策略在保护用户数据。协议、域名、端口任意一个不同就算跨域;前端可以发起请求,但浏览器会在读取响应时检查 CORS 头。真正的解决点通常在服务端:明确允许哪些来源、方法、请求头,是否允许携带 Cookie。开发环境可以用代理绕过限制,生产不要靠关闭安全策略或插件。

追问

CORS 和 JSONP 有什么区别?

CORS 是标准跨域机制,支持多种方法和预检;JSONP 只利用 script 标签,只能 GET,安全边界差。

为什么有些请求会先发 OPTIONS?

带自定义请求头、非简单方法或特殊 Content-Type 时,Chrome 会先发预检请求确认服务端是否允许。

如果 credentials: include,服务端必须回显具体 origin,不能是星号,还要设置 Access-Control-Allow-Credentials: true

开发代理和服务端 CORS 怎么取舍?

本地代理适合调试;上线后要让网关或应用服务配置 CORS,因为开发服务器代理不会跟着用户浏览器上线。

写段代码

js
res.setHeader('Access-Control-Allow-Origin', 'https://www.example.com'); res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization'); res.setHeader('Access-Control-Allow-Credentials', 'true');
标签:Chrome