跨域
一、为什么会出现跨域问题
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
二、什么是跨域
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
三、非同源限制
【1】无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
【2】无法接触非同源网页的 DOM
【3】无法向非同源地址发送 AJAX 请求
解决跨域的几种方法
- JSONP(JSON with Padding): JSONP是一种通过动态创建
<script>
标签来实现跨域请求的方法。服务器返回的响应被包裹在一个回调函数中,客户端通过指定回调函数的名称来接收响应数据。JSONP只支持GET请求,并且需要服务器端的支持。 - CORS(Cross-Origin Resource Sharing): CORS是一种基于HTTP头部的跨域解决方案。在服务器端设置响应头部,允许特定的源访问资源,从而实现跨域请求。CORS支持各种HTTP请求方法,并且相对于JSONP更加灵活和安全。
- 代理服务器: 可以通过设置一个代理服务器,将跨域请求转发到目标服务器,并将响应返回给客户端。代理服务器可以隐藏跨域请求的细节,同时也可以在服务器端进行一些处理或过滤。
- WebSocket协议: WebSocket协议是一种全双工通信协议,它在建立连接时并不受同源策略的限制。通过使用WebSocket协议,客户端和服务器可以建立长久的连接,实现跨域通信。
- 服务端设置代理: 在一些后端框架或服务器配置中,可以设置代理来转发跨域请求。例如,使用Nginx作为反向代理服务器,配置反向代理规则将跨域请求转发到目标服务器。