跨域的几种方式

本文深入解析跨域资源共享(CORS)、图像Ping、JSONP、Comet、WebSockets、HTML5 postMessage等跨域通信技术的原理及实现方式,涵盖前端开发中常见的跨域问题解决方案。

跨域的几种方式

  • CROS
  • 图像Ping
  • JOSNP
  • Comet
  • Web Sockets
  • HTML5 postMessage

CROS(Cross-Origin Resource Sharing): 跨域资源共享

原理是自定义HTTP头部Origin,这个部分由浏览器控制,这个过程与cookie无关。
例如:Origin: http://www.abc.com

服务器判读Origin的值是否在自己白名单当中,如果是,返回Access-Control-Allow-Origin: "http://www.abc.com"

当访问服务器的资源为公共资源时,也就是服务器不限制请求来源时,返回Access-Control-Allow-Origin: "*"

图像Ping

原理是创建一个实例,设置src进行单向通信,只能发送GET请求

var img = new Image();
img.onload = img.onerror = function() {
    alert("Ok");
}
img.src = "http://www.abc.com"

JSONP

原理是通过动态创建script标签完成

function handler(res) {
    console.log("The content:", res);
}
var script = document.createElement("script");
script.src = "http://www.abc.com?callback="handler"";
document.body.insertBefore(script, document.body.firstChild);

Comet

是一种服务器向页面推送数据技术。

有两种实现方式:长轮询HTTP流

长轮询

浏览器向服务器发送连接请求,浏览器就一直保持连接打开状态,服务器有数据时便发送数据到浏览器,浏览器关闭连接。然后再次发送连接请求。

HTTP流

浏览器向服务器发送一次连接请求,服务器一直保持连接打开状态。浏览器即使接受数据了也不会断开连接。

SSE(Server-Sent Event): 服务器发送事件

围绕着Comet推出的API

var source = new EventSource(url); //url 必须与source创建对象的页面同源。
source.onmessage = function(event) {
    var data = event.data;
    // 处理数据
}
source.close(); // 手动关闭连接

Web Sockets

在一个单独的持久连接上提供全双工、双向通信。

wx:// 或 wss:// 为协议名

var socket = new WebSocket("ws://www.abc.com/1.php");
// 成功连接后
socke.onopen = function(){
    alert("Connect Success");
}

// 连接发生错误
socket.onerror = function(err) {
    alert("Connect Failed ", err);
}

// 发送数据
socket.send("Test message");

// 接受数据
socket.onmessage = function(event) {
    var data = event.data;
    // 处理数据
}

socket.close() // 关闭socket连接

HTML5 postMessage

HTML5 window.postMessage 是一个安全的、基于事件的消息API,可用于html内嵌iframe、window.open()新窗口之间的通信。

//发送信息

window.postMessage(msg, url);

//接收postMessage信息

window.addEventListener("message", func, false);
function func(event) {
    var data = event.data;
    // 处理数据
}

转载于:https://www.cnblogs.com/miku561/p/10500537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值