JavaScript跨域问题本质是浏览器同源策略限制,CORS为现代标准方案,需服务端配置响应头;JSONP是利用script标签无跨域限制的取巧方法,仅支持GET且安全性弱;优先选CORS,JSONP仅作兜底。
JavaScript 的跨域问题本质是浏览器的同源策略限制:只要协议、域名、端口三者中任一不同,就视为不同源,AJAX 请求就会被拦截。解决的核心思路是绕过或说服浏览器允许跨域通信。CORS 和 JSONP 是两种最典型的方法,原理和适用场景差异明显。
CORS 是现代标准方案,靠服务器主动声明“谁可以访问我”。浏览器在发起跨域请求时,会先检查响应头中是否包含合法的 Access-Control-Allow-Origin 字段。如果匹配当前页面源(如 https://a.com),就放行响应;否则报错。
s(客户端实际发送的额外 header)JSONP 不是真正的“协议”,而是一种利用浏览器对 标签无跨域限制的“取巧”手段。它把数据包装成函数调用的形式,由服务端动态生成 JS 脚本并执行。
window.cb = function(data){...})
cb({"name":"Tom","age":25}) 的 JS 代码优先用 CORS。它支持所有 HTTP 方法、可携带凭证、有完善的错误反馈机制,是 W3C 标准。JSONP 仅作为兜底方案,适用于老系统或纯静态页面无法配置服务端响应头的极少数场景。
如果服务端不可控,还可考虑代理(开发用 webpack devServer proxy / 生产用 Nginx 反向代理),本质是让前端请求先打到同源服务器,再由它转发,彻底规避浏览器跨域检查。