一.什么是跨域
跨域(Cross-Origin Resource Sharing,简称 CORS)是指在浏览器中,由于安全原因,一个网页(即一个域下的文档)不能直接请求另一个域下的资源。这是浏览器的同源策略(Same-Origin Policy)的一部分,旨在防止恶意网站读取另一个网站的敏感数据。
同源策略:所谓同源策略是浏览器的一种安全机制,来限制不同源的网站不能通信。同源就是域名、协议、端口一致。
跨域问题通常发生在以下几种场景:
- Web 页面:当一个网页尝试通过
XMLHttpRequest
或fetch
API 请求另一个域的资源时。 - Web 字体:当网页尝试加载另一个域下的字体文件时。
- Web 插件:如 Flash 或 Silverlight,它们可能需要访问另一个域的资源。
二.解决方法
-
CORS 头部:服务器可以设置响应头
Access-Control-Allow-Origin
来允许特定的外部域访问资源。例如,Access-Control-Allow-Origin: *
允许所有域访问资源,而Access-Control-Allow-Origin: https://example.com
仅允许https://example.com
访问。 -
JSONP(JSON with Padding):这是一种老旧的技术,通过
<script>
标签获取跨域数据,因为<script>
请求不受同源策略限制。但 JSONP 只支持 GET 请求,且安全性较低。 -
代理服务器:客户端通过同域的代理服务器发送请求,代理服务器再请求目标域的资源,然后将响应转发回客户端。
-
CORS 任何源(CORS Anywhere):使用第三方服务作为代理,它会自动处理 CORS 问题。
-
PostMessage:这是一种 HTML5 引入的跨文档通信方式,允许不同源的窗口、iframe 之间发送消息。
-
Document.domain:如果两个页面有相同的
Document.domain
,即使它们是不同的子域,也可以相互通信。 -
Window.name:这是一种状态保存机制,可以用来在不同域之间安全地传输数据。
-
CORS 代理库:在客户端使用某些库,如
axios
等,它们可以配置请求头以处理 CORS。