跨域请求存在问题是因为浏览器存在安全策略,第一个是同源策略(SOP, Same-Origin Policy
),第二个是浏览器中不同域的框架(iframe)之间不能通过 js 进行交互。
同源策略的同源定义:如果协议(protocol),端口(port)和主机(host)对于两个页面是相同的,则两个页面具有相同的源。
几个常见的跨域请求方案
- 跨域资源共享(CORS,Cross-Origin Resource Sharing)。 跨域资源共享需要服务器端对
CORS
的支持,可以通过设置Access-Control-Allow-Origin
来进行支持;客户端进行请求的时候需要设置 Headermode: 'no-cors'
。支持所有的请求类型。 - 通过 JSONP(JSON with Padding) 进行跨域。JSONP 允许
callback({"name","trigkit4"});
这样的调用,<script src="http://example.com/data.php?callback=dosomething"></script>
在请求时服务器返回callback({})
进行调用。JSONP 支持 GET 请求,不受同源策略的限制(XMLHttpRequest
受限制),可以兼容旧的浏览器。 - 通过修改 document.domain 来跨子域。把父页面的
document.domain
设置成同页面中的 iframe 的document.domain
一样(主域必须一样),这样就可以获取子窗口的window
对象。 - 使用 window.name 来进行跨域。一个
window
的生命周期内,窗口载入的所有页面共享一个window.name
。 - 使用 HTML5 的 window.postMessage() 方法跨域。
window.postMessage(message,targetOrigin)
方法是 HTML5 新引进的特性,可以使用它来向其它的window
对象发送消息,无论这个window
对象是属于同源或不同源,目前 IE8+、FireFox、Chrome、Opera 等浏览器都已经支持window.postMessage()
方法。
跨域请求存在的问题
- 可能需要支持多套不同的鉴权策略。
- 接入多个服务让项目更加复杂。数据约定等。
参考:
Robin on February 16, 2017