请说明前端开发中处理跨域请求的常见方式,并比较各自的优缺点。
考察说明
考察对浏览器同源策略及跨域解决方案的掌握程度,以及根据场景选择合适方案的能力。
回答思路
- 【回答框架 1】浏览器同源策略限制跨域请求,协议、域名、端口任一不同即视为跨域。常见解决方案包括JSONP、CORS、代理服务器、postMessage等,各有适用场景。JSONP利用script标签不受同源限制的特性,通过动态插入script标签实现跨域,仅支持GET请求,且需服务端配合返回特定格式的脚本。优点是实现简单、兼容性好;缺点是不支持POST,存在安全风险,且依赖服务端支持。
- 【回答框架 2】CORS(跨域资源共享)是W3C标准,通过服务器设置HTTP响应头(如Access-Control-Allow-Origin)允许特定来源的跨域请求。浏览器会区分简单请求和预检请求,预检请求使用OPTIONS方法。优点是支持所有HTTP方法,标准且灵活;缺点是需要服务端配置,预检请求会增加一次网络往返,且旧浏览器兼容性有限。
- 【回答框架 3】代理服务器方案(如Nginx反向代理、Webpack devServer代理)是将请求发送到同源服务器,由服务器转发到目标服务器,从而规避浏览器同源限制。优点是无需前端改造,可靠安全;缺点是需要额外服务器资源,部署和配置复杂,且增加请求延迟。
- 【回答框架 4】postMessage可跨窗口传递数据,适用于iframe、弹窗等跨域通信场景。优点是简单直接,支持双向通信;缺点是仅限窗口间通信,不能用于普通AJAX请求,且需处理安全问题。其他方案如WebSocket不受同源策略限制,适用于实时通信,但需要服务端支持。
- 【关键点 1】同源策略指协议、域名、端口需完全一致。
- 【关键点 2】CORS支持所有HTTP方法,但需预检请求。
- 【关键点 3】JSONP仅支持GET,存在安全风险。
- 【关键点 4】代理服务器适用于前后端分离的架构。
- 【关键点 5】postMessage适用于跨域窗口通信。
- 【易错点 1】认为JSONP可替代CORS,忽略其仅支持GET和安全隐患。
- 【易错点 2】忽略CORS预检请求对性能的影响。
- 【易错点 3】代理服务器方案下,前端直接请求目标服务器会导致失败。