在 JavaScript 中,实现跨域访问主要有以下几种方式:
- JSONP:利用
<script>
标签的 src 属性指向跨域的 API,并在响应中执行函数调用来绕过跨域限制。
html
<script src="http://example.com/api?callback=func"></script>
<script>
function func(data) {
// ...
}
</script>
- CORS:在服务器端设置 Access-Control-Allow-Origin,指定允许的源,使浏览器允许跨域请求。
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/api');
xhr.send();
- Web proxy:使用代理服务器代理跨域请求。
var proxy = 'http://example.com/cors';
var proxyURL = proxy + '?url=' + url;
var xhr = new XMLHttpRequest();
xhr.open('GET', proxyURL);
xhr.send();
- WebSocket:WebSocket 是一种网络协议,它提供了在单个 TCP 连接上进行全双工通信的机制。
var ws = new WebSocket('ws://example.com/api');
ws.onopen = function() {
ws.send('Message');
}
ws.onmessage = function(e) {
// ...
}
- PostMessage:通过 window.postMessage 方法实现跨窗口通信
// 当前窗口
window.addEventListener("message", function(e) {
// ...
}, false);
// 其他窗口
var win = window.open("http://example.com/");
win.postMessage("Message", "http://example.com/");
所以,总结来说 JavaScript 中实现跨域访问的主要方式有:
- JSONP:通过
<script>
标签请求跨域 API - CORS:在服务器实现 CORS 跨域资源共享
- Web proxy:使用代理服务器作为中转
- WebSocket:利用 WebSocket 协议实现跨域通信
- PostMessage:通过 HTML5 提供的 window.postMessage 方法跨域通信
在实践中,我们应当优先选择 CORS 这种标准化方案,其次是 WebSocket 与 PostMessage。JSONP 用于古老浏览器对 CORS 不支持的情况。